从命令行在文件的每一行的开头添加字符串的最简单方法是什么?

syn*_*gma 8 sed awk perl text-processing

我正在寻找一种方法来在每一行的开头添加一些字符串(每行相同的字符串)。不是可定制的东西,而是易于记忆且可在每个 POSIX 兼容平台(以及每个 shell)上使用的东西。

Sté*_*las 14

:|paste -d'foo ' - - - - input > output
Run Code Online (Sandbox Code Playgroud)

(开个玩笑,尽管您可能会发现它是此处发布的所有解决方案中最快的:-b)。

规范的方式是:

sed 's/^/foo /' < input > output
Run Code Online (Sandbox Code Playgroud)

但是,它不容易适应任意字符串。例如,

sed "s/^/$var /"
Run Code Online (Sandbox Code Playgroud)

只有工作,如果$var不包含,&\/也不是换行符。

在这方面,

export var
awk '{print ENVIRON["var"], $0}'
Run Code Online (Sandbox Code Playgroud)

或者

perl -pe '$_="$ENV{var} $_"'
Run Code Online (Sandbox Code Playgroud)

会更好。


Jos*_* R. 8

您可以使用sed

sed -i 's/^/your_string /' your_file
Run Code Online (Sandbox Code Playgroud)

感谢 Stephane 和 Marco 的评论,请注意该-i选项不是 POSIX。执行上述操作的 POSIX 方法是

sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
Run Code Online (Sandbox Code Playgroud)

perl

perl -pi -e 's/^/your_string /' your_file
Run Code Online (Sandbox Code Playgroud)

解释

这两个命令都执行正则表达式替换,用^所需的字符串替换行 ( )的开头。-i两个命令中的开关确保文件被就地编辑(即更改反映在文件中而不是打印到标准输出)。

sed应该可以在任何符合 POSIX 的操作系统上使用,并且perl应该可以在大多数现代 Unices 上使用,除了那些已经通过删除它的努力

  • `sed -i` 不是 POSIX。是 GNU。FreeBSD `sed` 有一个类似的选项,但你需要在那里使用 `sed -i ''`。 (2认同)

Mar*_*rco 5

我提出了一个使用awk前缀字符串 \xe2\x80\x9cfoo\xe2\x80\x9d 的解决方案。

\n\n
awk \'{ print "foo", $0; }\' input > output\n
Run Code Online (Sandbox Code Playgroud)\n\n

awk是跨平台的,可在任何 POSIX 系统上使用。它不进行就地编辑。如果您想编辑一个文件而不创建第二个文件,则必须使用临时文件。请参阅约瑟夫的sed回答,它显示了语法。另一个技巧是使用以下语法,这基本上是创建一个与原始文件具有相同文件名的临时文件。

\n\n
{ rm file; awk \'{ print "foo", $0 }\' > file; } < file\n
Run Code Online (Sandbox Code Playgroud)\n