在 sed 中使用变量和 !d
Use variables in sed along with !d
苹果操作系统。我有以下文件,我必须从中删除 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
$
这可能适合您 (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
苹果操作系统。我有以下文件,我必须从中删除 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
$
这可能适合您 (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