我想使用 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 perlrun
或man 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
版本的真正原因是,您可以在每个命令中使用 而:
不是,以交互方式执行更改,同时在或+
中进行交互编辑。vi
vim
in.txt
在编辑器中打开()vim in.txt
您可以运行:
:%s/.*/<before> & and <after each line>/
:wq! out.txt
无论您使用非交互式版本还是交互式版本,它们的工作方式都相同。and vi
(vim
以及“vi
系列”中的许多其他文本编辑器)支持使用sed
类似语法的搜索和替换。您会注意到与sed
甜点答案中的方法:
.*
是一个正则表达式,它可以匹配任意字符(.
)零次或多次(*
),从而匹配整行。&
表示整场比赛。s/pattern/replacement/
替换第一次出现的pattern
与replacement
。
sed
自动应用其脚本每个行。vi
//vim
为ex
您提供更细粒度的控制。%s
执行搜索和替换(s
)操作所有线路( %
) 也可以写成1,$s
。如果您只想更改一行,可以写成3s
(仅第三行)。同样,您可以更改任何范围的行,例如,3,10s
第三行到第十行或10,$s
第十行及所有更高编号的行。