单个命令采用两个字符串来提取它们之间的字符串,例如 'tr'(不带表达式)

Gar*_*ver 5 sed text-processing quoting

在这里看到了一种使用 sed 在一行中的其他两个字符串之间获取文本的方法,例如:

sed 's/.*starting_text\(.*\)ending_text.*/\1/'
Run Code Online (Sandbox Code Playgroud)

但我想要一个简单的命令(比如tr,但是用于字符串提取),它只需要两个字符串,并且会在第一个字符串之前或第二个字符串之后修剪所有内容,例如

grep something some_file | between message\"\:\" " with"
Run Code Online (Sandbox Code Playgroud)

并且会处理转义字符。

Sté*_*las 8

如果分隔符每行可能出现多次,您可以使用 perl 代替,例如:

between() {
  perl -Tlne 'BEGIN{$b=shift;$e=shift}
             print for /\Q$b\E(.*?)\Q$e\E/g' "$@"
}
Run Code Online (Sandbox Code Playgroud)

然后例如:

$ echo "[b]test[e] foo [b]bar[e]" | between '[b]' '[e]'
test
bar
Run Code Online (Sandbox Code Playgroud)

您还可以将其用作:

between BEG END file1 file2...
Run Code Online (Sandbox Code Playgroud)

  • @GaryS.Weaver,是的,这就是 `\Q` 的用途。 (2认同)