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

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

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

答案1

:|paste -d'foo ' - - - - input > output

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

规范的方法是:

sed 's/^/foo /' < input > output

然而,它不容易适应任意字符串。例如,

sed "s/^/$var /"

仅当$var不包含 、&\/换行符时才有效,并且至少在无法保证的情况下是 GNU sed 中的任意命令执行漏洞。

在这方面,

export var
awk '{print ENVIRON["var"], $0}'

或者

perl -pe '$_="$ENV{var} $_"'

会工作得更好。

答案2

您可以使用sed

sed -i 's/^/your_string /' your_file

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

sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file

或者perl

perl -pi -e 's/^/your_string /' your_file

解释

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

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

答案3

我提出了一个使用awk前缀字符串“foo”的解决方案。

awk '{ print "foo", $0; }' input > output

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

{ rm file; awk '{ print "foo", $0 }' > file; } < file

答案4

您可以使用perl以下方法来执行此操作:

$ perl -pi -e 's/^/mystring /' afile.txt

例子

创建示例文件。

$ seq 5 > afile.txt

$ cat afile.txt
1
2
3
4
5

运行上面的命令:

$ perl -pi -e 's/^/mystring /' afile.txt

$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5

相关内容