linux 如何在文件的每一行的开头添加一个字符串?

66bbxpm5  于 2022-12-26  发布在  Linux
关注(0)|答案(9)|浏览(400)

我有下面的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
eoxn13cs

eoxn13cs1#

一行awk命令也可以达到这个目的:

awk '{print "prefix" $0}' file
b4wnujal

b4wnujal2#

关于您的原始错误:
./appendToFile.sh: line 11: /bin/sed: Argument list too long
问题出在这一行代码中:

sed -e 's/^/prefix/' $line

在此上下文中,$line是 * sed * 运行所针对的file name。要更正代码,应按如下方式修复此行:

echo $line | sed -e 's/^/prefix/'

(Also请注意,原始代码的末尾不应该有< $file。)
威廉·珀塞尔在他的两个建议中都正确地解决了这个问题。
但是,我相信您已经正确地识别出原始文本文件存在问题。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
gdx19jrr

gdx19jrr3#

整个循环可以替换为对整个文件进行操作的单个sed命令:

sed -e 's/^/prefix/' $file
uqzxnwby

uqzxnwby4#

Perl的实现方法是:

perl -p -e's/^/prefix' filename

perl -p -e'$_ = "prefix $_"' filename

在这两种情况下,都会从filename读取数据,并将带前缀的行打印到STDOUT。
如果你添加了一个-i标志,那么Perl将在适当的位置修改文件,你也可以指定多个文件名,Perl将神奇地完成所有这些操作。

eblbsuwk

eblbsuwk5#

与for循环相比,使用while read...更为合适:

while read -r line; do
do
    echo "$line" | sed -e 's/^/prefix/'
done < $file

但你会更好地与简单:

sed -e 's/^/prefix/' $file
px9o7tmv

px9o7tmv6#

使用sed,只需更改单词prefix

sed -e 's/^/prefix/' file.ext

如果要将输出保存在另一个文件中

sed -e 's/^/prefix/' file.ext > file_new.ext
ia2d9nvy

ia2d9nvy7#

您不需要sed,只需在echo命令中连接字符串即可

while IFS= read -r line; do
    echo "prefix$line"
done < filename

循环遍历文件中的每个word

for line in `cat file`; ...
ztigrdn8

ztigrdn88#

sed -i '1a\
Your Text' file1 file2 file3
busg9geu

busg9geu9#

没有sed/awk和while循环的解决方案:

xargs -n1 printf "$prefix%s\n" < "$file"

相关问题