Reputation: 6735
I have the following bash code which loops through a text file, line by line .. im trying to prefix the work 'prefix' to each line but instead am getting this error:
rob@laptop:~/Desktop$ ./appendToFile.sh stusers.txt kp
stusers.txt
kp
./appendToFile.sh: line 11: /bin/sed: Argument list too long
[email protected],passw0rd
This is the bash script ..
#!/bin/bash
file=$1
string=$2
echo "$file"
echo "$string"
for line in `cat $file`
do
sed -e 's/^/prefix/' $line
echo "$line"
done < $file
What am i doing wrong here?
Update: Performing head on file dumps all the lines onto a single line of the terminal, probably related?
rob@laptop:~/Desktop$ head stusers.txt
rob@laptop:~/Desktop$ ouse.com,passw0rd
Upvotes: 51
Views: 91455
Reputation: 985
A solution without sed/awk and while loops:
xargs -n1 printf "$prefix%s\n" < "$file"
Upvotes: 0
Reputation: 528
Concerning your original error:
./appendToFile.sh: line 11: /bin/sed: Argument list too long
The problem is with this line of code:
sed -e 's/^/prefix/' $line
$line
in this context is file name that sed is running against. To correct your code you should fix this line as such:
echo $line | sed -e 's/^/prefix/'
(Also note that your original code should not have the < $file
at the end.)
William Pursell addresses this issue correctly in both of his suggestions.
However, I believe you have correctly identified that there is an issue with your original text file. dos2unix
will not correct this issue, as it only strips the carriage returns Windows sticks on the end of lines. (However, if you are attempting to read a Linux file in Windows, you would get a mammoth line with no returns.)
Assuming that it is not an issue with the end of line characters in your text file, William Pursell's, Andy Lester's, or nullrevolution's answers will work.
A variation on the while read...
suggestion:
while read -r line; do echo "PREFIX " $line; done < $file
This could be run directly from the shell (no need for a batch / script file):
while read -r line; do echo "kp" $line; done < stusers.txt
Upvotes: 38
Reputation: 37070
Use sed. Just change the word prefix
.
sed -e 's/^/prefix/' file.ext
If you want to save the output in another file
sed -e 's/^/prefix/' file.ext > file_new.ext
Upvotes: 2
Reputation: 6158
The entire loop can be replaced by a single sed command that operates on the entire file:
sed -e 's/^/prefix/' $file
Upvotes: 16
Reputation: 246744
You don't need sed, just concatenate the strings in the echo command
while IFS= read -r line; do
echo "prefix$line"
done < filename
Your loop iterates over each word in the file:
for line in `cat file`; ...
Upvotes: 0
Reputation: 4117
a one-line awk command should do the trick also:
awk '{print "prefix" $0}' file
Upvotes: 86
Reputation: 93636
A Perl way to do it would be:
perl -p -e's/^/prefix' filename
or
perl -p -e'$_ = "prefix $_"' filename
In either case, that reads from filename
and prints the prefixed lines to STDOUT.
If you add a -i
flag, then Perl will modify the file in place. You can also specify multiple filenames and Perl will magically do all of them.
Upvotes: 5
Reputation: 212198
Instead of the for loop, it is more appropriate to use while read...
:
while read -r line; do
do
echo "$line" | sed -e 's/^/prefix/'
done < $file
But you would be much better off with the simpler:
sed -e 's/^/prefix/' $file
Upvotes: 4