【问题标题】:Use variables in sed along with !d在 sed 中使用变量和 !d
【发布时间】:2022-01-19 01:32:27
【问题描述】:

MacOS。我有以下文件,我必须从中删除firstlast 之间的所有行,包括firstlast 在文件中出现多次,我不想删除它。

$ cat sample.tf
some lines 1
some random 2
first
vdsvdfsv
vdsvdfsv
dfvbfbvfvfrver
bvevreverv
last
vfver
vever
end
last
some last
end
$

我可以用下面的命令做到这一点

$ sed '/^first/,/^last/{/^last/!d;}' sample.tf
some lines 1
some random 2
last
vfver
vever
end
last
some last
end
$

但我面临的挑战是我的firstlast 是变量。要使用变量,我必须使用 " 并尝试以下命令,但它正在尝试将 !d 转换为历史记录中的命令。我怎样才能实现我想要做的事情。

$ echo $startstring
first
$ echo $endstring
last
$
$ sed "/^$startstring/,/^$endstring/{/^$endstring/!d;}" sample.tf
sed "/^$startstring/,/^$endstring/{/^$endstring/diff main.tf main.tf.good ;}" sample.tf
sed: 1: "/^first/,/^last/{/^last ...": extra characters at the end of d command
$

$ !d
diff main.tf main.tf.good
$

【问题讨论】:

  • 你试过逃避吗? sed '/^first/,/^last/{/^first/\!d;}' sample.tf
  • @Zak 转义不起作用。 $ sed "/^$startstring/,/^$endstring/{/^$endstring/\!d;}" sample.tf sed: 1: "/^first/,/^last/{/^last ...": invalid command code \ $
  • 您可以混合搭配报价。 sed "/^$startstring/,/^$endstring/{/^$endstring/"'!d;}' sample.tf
  • 这是 Linux 吗?或者一个 *Nix like os -- IE MacOS
  • @WilliamPursell 的报价混合和匹配有效。谢谢你。

标签: sed


【解决方案1】:

@William Pursell 提出的混合搭配报价的建议对我有用。

sed "/^$startstring/,/^$endstring/{/^$endstring/"'!d;}' sample.tf

【讨论】:

    【解决方案2】:

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

    sed '/^'"${startstring}"'/,/^'"${endstring}"'/{/^'"${endstring}"'/!d}' file
    

    使用单引号来防止 ! 字符的 shell 插值。

    替代方案:

    sed -n '/^'"{startstring}"'/{:a;n;/^'"{endstring}"'/!ba};p' file
    

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 2012-12-24
      • 1970-01-01
      • 2019-05-18
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      相关资源
      最近更新 更多