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 '(?<=")[^"]*(?=")'