我有以下bash代码,它逐行循环遍历文本文件..我试图将工作'前缀'作为前缀添加到每一行但是却收到此错误:
rob@laptop:~/Desktop$ ./appendToFile.sh stusers.txt kp
stusers.txt
kp
./appendToFile.sh: line 11: /bin/sed: Argument list too long
115000_210org@house.com,passw0rd
这是bash脚本..
#!/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
我在这里做错了什么?
更新: 执行head on file会将所有行转储到终端的一行,可能是相关的?
rob@laptop:~/Desktop$ head stusers.txt
rob@laptop:~/Desktop$ ouse.com,passw0rd
答案 0 :(得分:39)
单行awk命令也可以解决这个问题:
awk '{print "prefix" $0}' file
答案 1 :(得分:14)
关于您的原始错误:
./ appendToFile.sh:line 11:/ bin / sed:参数列表太长
问题在于这行代码:
sed -e 's/^/prefix/' $line
$ line 是 sed 正在运行的文件名。要更正您的代码,您应该修复此行:
echo $line | sed -e 's/^/prefex/'
(另请注意,您的原始代码最后不应包含< $file
。)
William Pursell在他的两个建议中正确地解决了这个问题。
但是,我相信您已正确识别原始文本文件存在问题。 dos2unix
不会纠正这个问题,因为它只会剥离Windows在行尾的回车。 (但是,如果您尝试在Windows中读取Linux文件,则会得到一条没有返回的庞大行。)
假设文本文件中的行尾字符不是问题,William Pursell,Andy Lester或nullrevolution的答案都可以解决。
while read...
建议的变体:
while read -r line; do echo "PREFIX " $line; done < $file
这可以直接从shell运行(不需要批处理/脚本文件):
while read -r line; do echo "kp" $line; done < stusers.txt
答案 2 :(得分:8)
整个循环可以由对整个文件进行操作的单个sed命令替换:
sed -e 's/^/prefix/' $file
答案 3 :(得分:3)
使用while read...
:
while read -r line; do
do
echo "$line" | sed -e 's/^/prefix/'
done < $file
但是你可以用更简单的方式改善:
sed -e 's/^/prefix/' $file
答案 4 :(得分:3)
Perl的方法是:
perl -p -e's/^/prefix' filename
或
perl -p -e'$_ = "prefix $_"' filename
在任何一种情况下,都从filename
读取,并将前缀行打印到STDOUT。
如果添加-i
标志,则Perl将修改该文件。您还可以指定多个文件名,Perl将神奇地完成所有这些文件名。
答案 5 :(得分:1)
使用sed。只需更改单词prefix
。
sed -e 's/^/prefix/' file.ext
如果要将输出保存在另一个文件中
sed -e 's/^/prefix/' file.ext > file_new.ext
答案 6 :(得分:0)
您不需要sed,只需在echo命令中连接字符串
while IFS= read -r line; do
echo "prefix$line"
done < filename
您的循环遍历文件中的每个字:
for line in `cat file`; ...