在 sed 中使用变量和 !d

Use variables in sed along with !d

苹果操作系统。我有以下文件,我必须从中删除 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
$

这可能适合您 (GNU sed):

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

使用单引号防止 shell 插入 ! 字符。

选择:

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

来自@William Pursell 的混合搭配引语的建议对我有用。

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