I realise this thread is over a month old, but I'll add my input even if it's no longer useful to the original poster, but just for others browsing. I realise the following code is far from elegant (ugly would be a good word), but it "works" (namely, it allows you to read full lines including nulls into a string for processing, one line at a time, without losing the nulls, using only Bash builtins).
Bash treats strings the same as C does (null-terminated), so it is obviously impossible to read in strings containing true nulls. The following code only breaks from the loop when the "read" command returns null (\0) twice in a row without other intervening text. It optionally adds an escaped null back into the string with each non-terminal read.
Generally it is far less painful to use something like Perl for this, but if you really are stuck in Bash and need a solution without external tools, maybe this will help.
Code:
printf \
"hello\0word\0done\0\n"\
"this\0next\0line\0\n"\
"last\0ln\n"\
> grb
buffer=""
xtra=""
while IFS= read -r -d '' ln; do
buffer+="$xtra"
## If you wish to re-include the nulls as \0, which will work
## when you output with "printf", do this
if [[ -n "$buffer" ]]; then
buffer+="\0"
## otherwise
#buffer+=" "
fi
buffer+="${ln%%$'\n'*}"
xtra="${ln#*$'\n'}"
if [[ "${ln/$'\n'}" != "$ln" ]]; then
## USE "$buffer" HERE HOWEVER YOU WISH
printf "${buffer}\n" ## ..for example
## ...TILL HERE
buffer=""
else
xtra=""
fi
done <grb
Quote:
(And, it seems to me, there is some glitch in bash-2.05 in processing pipe by while (something about that I've experiensed about half year ago.) Seems something with asigning variables...
So, another point why I do not like that solution by 'tr..'
When bash reads from a pipe it spawns a subshell, so any variables you assign within the subshell will disappear after the command/loop which reads from the pipe finishes. It's not a "glitch", it's a feature. Using shell redirection avoids this. For example:
Code:
blob=""
while read temp; do
blob+="$temp"
done < filename
echo "$blob"
will work, but:
Code:
blob=""
cat filename | while read temp; do
blob+="$temp"
done
echo "$blob"
STEP 1
# Set variable
FILE=/tmp/mainfile
SEARCHFILE =/tmp/searchfile
# THIS IS THE MAIN FILE.
cat /tmp/mainfile
Interface Ethernet0/0 "outside", is up, line protocol is up
Hardware is i82546GB rev03, BW 100 Mbps
Full-Duplex(Full-duplex), 100 Mbps(100 Mbps)
MAC address... (6 Replies)
Hi ,
I am trying to write an shell, which reads a text file (from a location) having a list of numbers of strictly 5 digits only ex: 33144
Now my script will check :
1) that each entry is only 5 digits & numeric only, no alphabets, & its not empty.
2)then it executes a shell script called... (8 Replies)
Hi All,
I'm trying to figure out which are the trusted-ips and which are not using a script file.. I have a file named 'ip-list.txt' which contains some ip addresses and another file named 'trusted-ip-list.txt' which also contains some ip addresses. I want to read a line from... (4 Replies)
hello all
I'm writing a bash script and I need to read data from a file line by line
The number of words of each line is not known and I want to check if anywhere
in the line exists the substring www..That substring is a string by itself
or a substring of other strings.So what I tried so far... (4 Replies)
Hello,
I need a program that read a file line by line and prints out lines 1, 2 & 3 after an empty line... An example of entries in the file would be:
SRVXPAPI001 ERRO JUN24 07:28:34 1775
REASON= 0000, PROCID= #E506 #1065: TPCIPPR, INDEX= 003F
... (8 Replies)
Hi All,
Am trying to write wrapper shell/bash script on a utility tool for which i need to pass 2 files as arugment to execute utility tool.
Wraper script am trying is to do with above metion 2 files.
utility tool accepts :
a. userinfo file : which contains username
b. item file : which... (2 Replies)
Hi all,
I have a log file say Test.log that gets updated continuously and it has data in pipe separated format. A sample log file would look like:
<date1>|<data1>|<url1>|<result1>
<date2>|<data2>|<url2>|<result2>
<date3>|<data3>|<url3>|<result3>
<date4>|<data4>|<url4>|<result4>
What I... (3 Replies)
Heyas
I'm trying to read/display a file its content and put borders around it (tui-cat / tui-cat -t(ypwriter).
The typewriter-part is a 'bonus' but still has its own flaws, but thats for later.
So in some way, i'm trying to rewrite cat using bash and other commands.
But sadly it fails on... (2 Replies)
Hello,
I'm works on Ubuntu server
My goal : I would like to read file line per line, but i want to started at the end of file.
Currently, I use instructions :
while read line;
do
COMMAND
done < /var/log/apache2/access.log
But, the first line, i don't want this. The file is long... (5 Replies)
I have a file
file_name_O.txt
The file can have different number of other files names or nothing
I will check
cnt=`wc -l file_name_0.txt`
if ;then
exit 1
fi
Now I have to start checking file names, i.e. read txt file line by line. If amount of ,lines equal 1, I can... (4 Replies)
Discussion started by: digioleg54
4 Replies
LEARN ABOUT FREEBSD
random
RANDOM(6) BSD Games Manual RANDOM(6)NAME
random -- random lines from a file or random numbers
SYNOPSIS
random [-elrUuw] [-f filename] [denominator]
DESCRIPTION
Random has two distinct modes of operations. The default is to read in lines from the standard input and randomly write them out to the
standard output with a probability of 1 / denominator. The default denominator for this mode of operation is 2, giving each line a 50/50
chance of being displayed.
The second mode of operation is to read in a file from filename and randomize the contents of the file and send it back out to standard out-
put. The contents can be randomized based off of newlines or based off of space characters as determined by isspace(3). The default
denominator for this mode of operation is 1, which gives each line a chance to be displayed, but in a random(3) order.
The options are as follows:
-e If the -e option is specified, random does not read or write anything, and simply exits with a random exit value of 0 to denominator
- 1, inclusive.
-f filename
The -f option is used to specify the filename to read from. Standard input is used if filename is set to '-'.
-l Randomize the input via newlines (the default).
-r The -r option guarantees that the output is unbuffered.
-U Tells random(6) that it is okay for it to reuse any given line or word when creating a randomized output.
-u Tells random(6) not to select the same line or word from a file more than once (the default). This does not guarantee uniqueness if
there are two of the same tokens from the input, but it does prevent selecting the same token more than once.
-w Randomize words separated by isspace(3) instead of newlines.
SEE ALSO random(3), fortune(6)HISTORY
The functionality to randomizing lines and words was added in 2003 by Sean Chittenden <seanc@FreeBSD.org>.
BUGS
No index is used when printing out tokens from the list which makes it rather slow for large files (10MB+). For smaller files, however, it
should still be quite fast and efficient.
BSD February 8, 2003 BSD