使用 Bash 替换 ASCII 文件中一行中的第二个字符串实例

mcE*_*nge 5 command-line bash sed text-processing

我有一个具有以下结构的 ASCII 文件:

file1.png otherfile1.png
file2.png otherfile2.png
file3.png otherfile3.png
...
Run Code Online (Sandbox Code Playgroud)

我想替换.png.mat, 但仅用于第二列。结果应该是这样的:

file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
...
Run Code Online (Sandbox Code Playgroud)

我如何在 Bash 中做到这一点?

Zan*_*nna 13

好吧,如果它是行的尽头......

$ sed 's/\.png$/.mat/' file
file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
Run Code Online (Sandbox Code Playgroud)
  • s/old/new/ 搜索和替换
  • \. 文字点(没有转义,它匹配任何字符)
  • $ 行结束

或者要明确指定第二列,您可以使用一种awk方法...

$ awk 'gsub(".png", ".mat", $2)' file
file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
Run Code Online (Sandbox Code Playgroud)
  • gsub(old, new, where) 搜索和替换
  • $2 第二列

  • 或者,“s/png/mat/2”告诉 sed 替换第二个实例。 (3认同)

Byt*_*der 7

您可以替换所有.png直接串在一行结束INPUTFILE这样的:

sed 's/\.png$/.mat/' INPUTFILE
Run Code Online (Sandbox Code Playgroud)

上面的命令不会修改INPUTFILE,只会将更改后的版本打印到终端。

要直接就地编辑文件,请将-i标志添加到sed(或-i.bak存储原始文件的备份):

sed -i 's/\.png$/.mat/' INPUTFILE
Run Code Online (Sandbox Code Playgroud)