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)
会更好。
您可以使用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 上使用,除了那些已经通过删除它的努力。
我提出了一个使用awk前缀字符串 \xe2\x80\x9cfoo\xe2\x80\x9d 的解决方案。
awk \'{ print "foo", $0; }\' input > output\nRun Code Online (Sandbox Code Playgroud)\n\nawk是跨平台的,可在任何 POSIX 系统上使用。它不进行就地编辑。如果您想编辑一个文件而不创建第二个文件,则必须使用临时文件。请参阅约瑟夫的sed回答,它显示了语法。另一个技巧是使用以下语法,这基本上是创建一个与原始文件具有相同文件名的临时文件。
{ rm file; awk \'{ print "foo", $0 }\' > file; } < file\nRun Code Online (Sandbox Code Playgroud)\n