如何正确使用 sed 删除“”字符之外的文本?

如何正确使用 sed 删除“”字符之外的文本?

aaaaaa"bbbbb"aaaa我有只想输出的文本bbbbb

我已经尝试过了sed -e 's/"\(.*\)"/\1/',但它只剪切了"角色。我如何正确过滤这个

答案1

轻松工作cut

如果文本来自标准输入:

echo 'aaaaaa"bbbbb"aaaa' | cut -d\" -f2

如果文本位于名为的文件中filename

cut -d\" -f2 filename

命令解释cut

  • -d\"告诉cut分隔符 is "\is 用于转义,否则 shell 会抱怨未闭合的引号)
  • -f2告诉cut抓取第二个字段(由"上面分隔)

答案2

sed不只是输出命令“右侧”中的任何内容s。它将左侧匹配替换为右侧,并输出结果行(或者,更技术性地说,模式空间)。

echo 'aa"bb"aa'|sed 's/"\(.*\)"/\1/'

左侧正则表达式匹配"bb".它被捕获组捕获的内容替换:bb。那么,输出就是aabbaa

请注意上面的内容与

echo 'aa"bb"aa'|sed 's/.*"\(.*\)".*/\1/'

该正则表达式匹配整行,因此aa"bb"aa被替换为bb,这是输出。

另一个可能的工具是awk

echo 'aa"bb"aa'|awk -F '"' '{print $2}'

这里"使用 用作分隔符并打印第二个字段。

答案3

当您想要一个sed解决方案时,这里有一个与以下组合的解决方案tr

echo 'aaaaaa"bbbbb"aaaa' | tr '"' '\n' | sed -n 2p

或使用awk

echo 'aaaaaa"bbbbb"aaaa' | awk -F'"' '{print $2}'

(我还是更喜欢cut,参见@GMaster的回答)。

答案4

grep解决方案(使用前瞻,因此使用 PCRE 选项):

grep -oP '(?<=")[^"]*(?=")'

相关内容