我正在寻找一种方法,将一些字符串添加到每行的开头(每行使用相同的字符串)。不是可定制的,而是易于记住并且在每个 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