如何将字符串前置到文件中每行的开头?

时间:2012-11-27 14:26:05

标签: linux bash sed

我有以下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

7 个答案:

答案 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...

代替for循环,更合适
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`; ...