【发布时间】:2022-01-19 01:32:27
【问题描述】:
MacOS。我有以下文件,我必须从中删除first 和last 之间的所有行,包括first。 last 在文件中出现多次,我不想删除它。
$ 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
$
但我面临的挑战是我的first 和last 是变量。要使用变量,我必须使用 " 并尝试以下命令,但它正在尝试将 !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