Avi*_*Raj 23 command-line bash text-processing
我想使用单个终端命令将多个文本文件的第 5 行(file1.txt,file2.txt,file3.txt,file4.txt)替换为字符串“Good Morning”。
所有文本文件都位于我的~/Desktop.
注意:我的桌面由 6 个 .txt 文件组成。我只想将更改应用于上述 4 个文本文件。
ter*_*don 42
这里有一些方法。我正在使用大括号扩展( file{1..4}.txt) 这意味着file1.txt file2.txt file3.txt file4.txt
珀尔
perl -i -pe 's/.*/ Good Morning / if $.==5' file{1..4}.txt
Run Code Online (Sandbox Code Playgroud)
-i: 导致perl就地编辑文件,更改原始文件。
如果-i后跟文件扩展名后缀,则为每个被修改的文件创建一个备份。例如:-i.bak创建一个file1.txt.bakiffile1.txt在执行过程中被修改。
-p: 表示逐行读取输入文件,应用脚本并打印。
-e: 允许您从命令行传递脚本。
s/.*/ Good Morning /:这会将当前行 ( .*) 中的文本替换为早安。
$.是一个特殊的 Perl 变量,用于保存输入文件的当前行号。所以s/foo/bar/ if $.==5,来代替foo与bar仅在5日线。
sed
sed -i '5s/.*/ Good Morning /' file{1..4}.txt
Run Code Online (Sandbox Code Playgroud)
-i: 像 for 一样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
Run Code Online (Sandbox Code Playgroud)
awk没有等效于-i选项¹,这意味着我们需要创建一个临时文件 ( foobar),然后将其重命名以覆盖原始文件。bash 循环for f in file{1..4}.txt; do ... ; done简单地遍历每个file{1..4}.txt,将当前文件名保存为$f. 在awk,NR是当前行号,是当前行$0的内容。因此,脚本将$0仅在第 5 行将( )行替换为“早安”。1;是awk为“打印行”。
¹较新的版本与 devnull 在他的回答中显示的一样。
核心工具
for f in file{1..4}.txt; do
(head -4 "$f"; echo " Good Morning "; tail -n +6 "$f") > foobar &&
mv foobar "$f";
done
Run Code Online (Sandbox Code Playgroud)
循环在上一节中进行了解释。
head -4: 打印前 4 行
echo " Good Morning ":打印“早安”
tail -n +6: 打印从第 6 行到文件末尾的所有内容
( )这三个命令周围的括号允许您捕获所有三个命令的输出(因此,第 4 行,然后是“早上好”,然后是其余的行)并将它们重定向到一个文件。
dev*_*ull 25
你可以使用sed:
sed '5s/^/Good morning /' file
Run Code Online (Sandbox Code Playgroud)
将追加Good morning到文件的第五行。
如果要替换第 5 行的内容,请说:
sed '5s/.*/Good morning/' file
Run Code Online (Sandbox Code Playgroud)
如果您想就地保存对文件的更改,请使用以下-i选项:
sed -i '5s/.*/Good morning/' file
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
GNU awk 版本 4.1.0 及更高版本带有启用就地编辑的扩展。所以你可以说:
gawk -i inplace 'NR==5{$0="Good morning"}7' file
Run Code Online (Sandbox Code Playgroud)
将文件中的第 5 行替换为Good morning!
| 归档时间: |
|
| 查看次数: |
64070 次 |
| 最近记录: |