【问题标题】:Remove n lines after nth occurrence of a pattern and paste content of a file after nth occurrence in unix在第 n 次出现模式后删除 n 行并在 unix 中第 n 次出现后粘贴文件的内容
【发布时间】:2020-03-09 04:57:24
【问题描述】:

我有一个包含两个重复字符串的文件,这是我要识别的标记。标记是“(CO)VARIANCES”,每个主题都遵循 3 条不同的线。我想删除第一个字符串之后的 3 行并将其替换为另一个文件的内容。文件结构如下:

cat file1.txt
Something1
Something2
Something3
(CO)VARIANCES
44.572      0.28723E-01   0.0000
0.28723E-01  0.64501E-03   0.0000
0.0000       0.0000      0.0000
Something4
Something5
Something6
(CO)VARIANCES
34.891      0.38642E-01   1.7538
0.38642E-01  0.17122E-02  0.54735E-02
1.7538      0.54735E-02  0.23285

我想删除(CO)VARIANCES 之后的三行并将其替换为另一个包含某些内容的文件。命令

sed -e '/(CO)VARIANCES/{n;N;N;d}' file1.txt

正在删除两个标记后的 3 行,我不知道如何指示此命令中的出现次数。而且我不知道如何在这些标记之后有条件地粘贴第二个文件的第二个内容。有人对此有想法吗?

【问题讨论】:

  • 请显示其他文件的内容和预期的输出。我是否理解正确,您只想替换第一次出现 (CO)VARIANCES 之后的 3 行,并在第二次(可能以后)(CO)VARIANCES 之后保留数据不变?
  • @Bodo,是的,没错,你完全理解。我也想对第二个标记做同样的事情。另一个文件的内容与我要删除的 3 行相同。事实上,我想用新值替换这 3 行。

标签: string file unix sed paste


【解决方案1】:

要在第 N 次出现时执行替换,请考虑以下脚本(N 是第 n 次出现)

awk -v N=3 '

  # Delete if needed
DEL > 0 { DEL-- ; next } ;

  # Find matching line
$1 == "(CO)VARIANCES" && (--N) == 0 {
  print
  DEL = 3 ;

  # Include second file here.
  while ( getline v < "file2.txt" ) print v ;
  next
}
   # Print all other lines
{ print }
'

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -En '/\(CO\)VARIANCES/{n;:a;s/[^\n]*/&/3;tb;N;ba;:b;p}' file2 |
    sed -Ee '/\(CO\)VARIANCES/{n;:a;R /dev/stdin' -e 's/[^\n]*/&/3;tb;N;ba;:b;d}' file1
    

    解决方案由两个通过管道连接的 sed 调用组成。

    第一次 sed 调用准备了一个文件,该文件由 file2 中标记后的行组成(在本例中为 3)。

    第二次 sed 调用从第一次调用中读取所需的行数,并从标记后的 file1 中删除相同数量的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多