我想使用 sed 或其他解决方案修改文本文件中的每一行

我想使用 sed 或其他解决方案修改文本文件中的每一行

我想使用 sed 或其他解决方案修改文本文件中的每一行

input.txt 包含

line 1
line 2 
line 3 
...

output.txt 应该添加两个字符串和

<before> line 1 and <after each line>
<before> line 2 and <after each line>
<before> line 3 and <after each line>
...

我可以使用 sed 或者其他什么吗?

答案1

使用 sed:

sed 's/.*/<before> & and <after each line>/' input.txt > output.txt

解释

  • s/x/y/– 用 y 代替 x
  • .*– 乘坐整条线路
  • &– 获取匹配的文本

其余的只是您想要在之前和之后添加的文本&

答案2

使用 awk:

awk '{print before, $0, after}' before="<before>" after="and <after each line" input.txt > output.txt

before这只会打印变量($0当前行)和变量的内容after,以空格分隔。变量在 awk 表达式之后设置。

答案3

perl

perl -ne 'chomp; print "<before> $_ and <after each line>\n"' in.txt > out.txt

这些改变可能有用:

  • 代替<before>and <after each line>添加任何您真正想添加的内容。
  • 删除> out.txt以将输出发送到终端而不是文件。
  • 您可以删除输入文件名(in.txt)并以交互方式输入以进行测试。

怎么运行的:

  • -p使 Perl 解释器对每一行进行操作(参见perldoc perlrunman perlrun)。
  • -e导致下一个参数是 perl 脚本。因此 中的部分' '是 Perl 代码。
  • chomp删除每行末尾的行终止符(换行符)perl
  • " "引用的字符串支持插值。$_是读取的行。\n新队特点。
  • perl将用作in.txt输入文件。in>告诉> out.txt您的 shell重定向输出。

此命令具有相同的效果,因为-p(与 不同-n)会自动打印每一行($_):

perl -pe 'chomp; $_ = "<before> $_ and <after each line>\n"' in.txt > out.txt

还有更多sed类似 的使用方法perl。这里展示的方法的一个优点是可读性。

答案4

vi/ vim/ex,您可以为此编写一个非交互式的单行程序,或者在打开的编辑器中执行此操作。

您可以在 shell 中使用以下任一命令。它们打开编辑器,在每行的开头和结尾添加文本,使用不同的文件名保存文件,然后退出编辑器:

ex in.txt '+%s/.*/<before> & and <after each line>/' '+wq out.txt'
vi in.txt '+%s/.*/<before> & and <after each line>/' '+wq! out.txt'

第一个命令使用ex模式,wq足以将缓冲区保存为out.txt并退出。第二个命令使用vi模式,因为更改的缓冲区仍然打开,尚未保存到原来的文件,它需要!该命令的版本。

第二条命令也可以在ex模式下使用(并使用vim而不是vi),但没有理由避免ex使用单行命令。我展示该vi版本的真正原因是,您可以在每个命令中使用 而:不是,以交互方式执行更改,同时在或+中进行交互编辑。vivim

in.txt在编辑器中打开()vim in.txt您可以运行:

:%s/.*/<before> & and <after each line>/
:wq! out.txt

无论您使用非交互式版本还是交互式版本,它们的工作方式都相同。and vivim以及“vi系列”中的许多其他文本编辑器)支持使用sed类似语法的搜索和替换。您会注意到与sed甜点答案中的方法

  • .*是一个正则表达式,它可以匹配任意字符(.)零次或多次(*),从而匹配整行。
  • &表示整场比赛。
  • s/pattern/replacement/替换第一次出现的patternreplacement

sed自动应用其脚本每个行。vi//vimex您提供更细粒度的控制。%s执行搜索和替换(s)操作所有线路( %) 也可以写成1,$s。如果您只想更改一行,可以写成3s(仅第三行)。同样,您可以更改任何范围的行,例如,3,10s第三行到第十行或10,$s第十行及所有更高编号的行。

相关内容