我正在 Mac 上编辑一个名为“test.txt”的大型文本文件。大多数行以 #
开头,但有些行是制表符分隔的字段列表:
val1 val2 val3 val4 val5 val6 val7 val8 val9
我想做的是找到 val2 = foo
和 val3 = bar
的特定行(或者只是 grep 查找字符串 foo\t bar
,然后仅在这些行上,将 val9
替换为字符串 val9=val9
。因此,如果 val9
是 'g1.t1'
,我会将其替换为 'g1.t1=g1.t1'
。
我能够想出以下命令:
fgrep -l -w 'foo bar' test.txt | xargs sed -i "" 's/\([^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\)\t\([^\t]*\)/\1\t\2=\2/'
找到这些行,并进行这些修改,但这只是打印出这些修改后的行。
我想将整个文件写回一个名为“test_edited.txt”的新文件,仅进行这些更改。我觉得我提出的解决方案(依靠将 fgrep
的输出通过管道传输到 sed
)不允许这样做。但也许我错过了一些东西?
欢迎任何建议!
谢谢!
最佳答案
awk
比带有看起来非常笨拙的正则表达式的 grep + xargs + sed` 更适合这项工作:
awk 'BEGIN{FS=OFS="\t"}
$2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file
# if you want to save changes back to original file use:
awk 'BEGIN{FS=OFS="\t"}
$2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file > _tmp &&
mv _tmp file
关于awk - 在文件名中与模式匹配的特定位置插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75186286/