问题描述
我想使用单个终端命令将多个文本文件(file1.txt、file2.txt、file3.txt、file4.txt)的第 5 行替换为字符串“Good Morning”。
所有文本文件都位于我的 ~/Desktop
上。
注意:我的桌面由 6 个 .txt 文件组成。我只想将更改应用于上述 4 个文本文件。
最佳答案
这里有一些方法。我正在使用 brace expansion ( file{1..4}.txt
) 这意味着 file1.txt file2.txt file3.txt file4.txt
-
Perl
perl -i -pe 's/.*/ Good Morning / if $.==5' file{1..4}.txt
解释:
-
-i
:使perl
就地编辑文件,更改原始文件。如果-i
后跟文件扩展名后缀,则为每个修改的文件创建备份。例如:如果file1.txt
在执行过程中被修改,-i.bak
创建一个file1.txt.bak
。 -
-p
:表示逐行读取输入文件,应用脚本并打印。 -
-e
:允许您从命令行传递脚本。 -
s/.*/ Good Morning /
:这会将当前行 (.*
) 中的文本替换为早安。 -
$.
是一个特殊的 Perl 变量,用于保存输入文件的当前行号。因此,s/foo/bar/ if $.==5
表示仅在第 5 行用bar
替换foo
。
-
-
sed
sed -i '5s/.*/ Good Morning /' file{1..4}.txt
解释:
-
-i
:与perl
一样,就地编辑文件。
默认情况下,
sed
打印输入文件的每一行。5s/pattern/replacement/
表示第 5 行替换模式。 -
-
awk
for f in file{1..4}.txt; do awk 'NR==5{$0=" Good Morning "}1;' "$f" > foobar && mv foobar "$f"; done
解释:
awk
与-i
选项没有等价物¹,这意味着我们需要创建一个临时文件 (foobar
),然后将其重命名以覆盖原始文件。 bash 循环for f in file{1..4}.txt; do ... ; done
简单地遍历每个file{1..4}.txt
,将当前文件名保存为$f
。在awk
中,NR
是当前行号,$0
是当前行的内容。因此,脚本将仅在第 5 行将行 ($0
) 替换为“早安”。1;
是awk
用于“打印行”。¹较新的版本与他的 answer 中显示的 devnull 一样。
-
核心工具
for f in file{1..4}.txt; do (head -4 "$f"; echo " Good Morning "; tail -n +6 "$f") > foobar && mv foobar "$f"; done
解释:
循环在上一节中进行了解释。
-
head -4
: 打印前 4 行 -
echo " Good Morning "
: 打印“早安” -
tail -n +6
:打印从第 6 行到文件末尾的所有内容
这三个命令周围的括号
( )
允许您捕获所有三个命令的输出(因此,第 4 行,然后是“早上好”,然后是其余行)并将它们重定向到一个文件。 -
次佳答案
您可以使用 sed
:
sed '5s/^/Good morning /' file
将 Good morning
附加到文件的第五行。
如果要替换第 5 行的内容,请说:
sed '5s/.*/Good morning/' file
如果您想就地保存对文件的更改,请使用 -i
选项:
sed -i '5s/.*/Good morning/' file
sed
一次可以处理多个文件。您可以在命令的末尾添加更多文件名。您还可以使用 bash 扩展来匹配特定文件:
# manually specified
sed -i '5s/.*/Good morning/' file1.txt file2.txt file3.txt file4.txt
# wildcard: all files on the desktop
sed -i '5s/.*/Good morning/' ~/Desktop/*
# brace expansion: file1.txt, file2.txt, file3.txt, file4.txt
sed -i '5s/.*/Good morning/' file{1..4}.txt
你 can read more about brace expansions here 。
GNU awk 版本 4.1.0 及更高版本带有 an extension,可启用就地编辑。所以你可以说:
gawk -i inplace 'NR==5{$0="Good morning"}7' file
用 Good morning
替换文件中的第 5 行!