我有下面的bash代码,它在文本文件中逐行循环。我试图在每行前面加上work 'prefix',但却得到了这个错误:
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
我到底做错了什么?
更新:执行文件头将所有行转储到终端的一行上,可能相关吗?
rob@laptop:~/Desktop$ head stusers.txt
rob@laptop:~/Desktop$ ouse.com,passw0rd
9条答案
按热度按时间eoxn13cs1#
一行awk命令也可以达到这个目的:
b4wnujal2#
关于您的原始错误:
./appendToFile.sh: line 11: /bin/sed: Argument list too long
问题出在这一行代码中:
在此上下文中,
$line
是 * sed * 运行所针对的file name。要更正代码,应按如下方式修复此行:(Also请注意,原始代码的末尾不应该有
< $file
。)威廉·珀塞尔在他的两个建议中都正确地解决了这个问题。
但是,我相信您已经正确地识别出原始文本文件存在问题。
dos2unix
不会纠正此问题,因为它只会删除Windows在行尾的回车符。(但是,如果您试图在Windows中读取Linux文件,则会得到一个没有回车符的庞大行。假设这不是文本文件中行尾字符的问题,那么William Pursell、Andy Lester或nullrevolution的答案都可以。
while read...
建议的变体:这可以直接从shell运行(不需要批处理/脚本文件):
gdx19jrr3#
整个循环可以替换为对整个文件进行操作的单个sed命令:
uqzxnwby4#
Perl的实现方法是:
或
在这两种情况下,都会从
filename
读取数据,并将带前缀的行打印到STDOUT。如果你添加了一个
-i
标志,那么Perl将在适当的位置修改文件,你也可以指定多个文件名,Perl将神奇地完成所有这些操作。eblbsuwk5#
与for循环相比,使用
while read...
更为合适:但你会更好地与简单:
px9o7tmv6#
使用sed,只需更改单词
prefix
。如果要将输出保存在另一个文件中
ia2d9nvy7#
您不需要sed,只需在echo命令中连接字符串即可
循环遍历文件中的每个word:
ztigrdn88#
busg9geu9#
没有sed/awk和while循环的解决方案: