【问题标题】:Inserting text at specific position in file names which match a pattern在与模式匹配的文件名中的特定位置插入文本
【发布时间】:2023-01-22 12:02:14
【问题描述】:

我正在 Mac 上编辑一个名为“test.txt”的大型文本文件。大多数行以 # 开头,但有些行是制表符分隔的字段列表:

val1    val2    val3    val4    val5    val6    val7    val8    val9

我想做的是找到val2 = fooval3 = 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,不允许这样做。但也许我错过了什么?

欢迎任何建议!

谢谢!

【问题讨论】:

    标签: sed grep xargs


    【解决方案1】:

    awk 比带有非常笨拙的正则表达式的 grep + xargs + sed 更适合这项工作:

    awk 'BEGIN{FS=OFS="	"}
         $2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file
    
    # if you want to save changes back to original file use:
    awk 'BEGIN{FS=OFS="	"}
    $2 == "foo" && $3 == "bar" {$9 = $9 "=" $9} 1' file > _tmp &&
    mv _tmp file
    

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2018-07-20
      • 2019-01-03
      相关资源
      最近更新 更多