使用Sed从具有多个特殊字符的字符串中提取子字符串

时间:2015-10-22 20:17:07

标签: regex bash sed

我有一个文本文件,其中一行显示为:

<div id="page_footer"><div><? print('Any phrase's characters can go here!'); ?></div></div>

我想要使用sedawk在单引号之间提取上面的子字符串,以便打印...

Any phrase's characters can go here!

我希望这个短语可以像上面那样分隔,从单引号开始,然后以单引号结束,然后是括号,然后是分号。带捕获组的以下sed命令似乎对我不起作用。建议?

sed '/^<div id="page_footer"><div><? print(\'\(.\+\)\');/ s//\1/p' /home/foobar/testfile.txt

2 个答案:

答案 0 :(得分:1)

使用高级grep(例如在Linux中),这可能是您正在寻找的

grep -Po "(?<=').*?(?='\);)"

答案 1 :(得分:1)

不正确的是使用剪切

 grep "page_footer" /home/foobar/testfile.txt | cut -d "'" -f2

字符串中的单引号会出错。首先计算单引号的数量会将其从简单解决方案变为过于复杂的解决方案。

使用sed的解决方案更好:删除所有内容,直到第一个单引号和最后一个之后的所有内容。当您首次使用单引号关闭sed参数时,字符串中的单引号变得混乱,转义单引号并再次打开sed字符串:

grep page_footer /home/foobar/testfile.txt | sed -e 's/[^'\'']*//' -e 's/[^'\'']*$//'

这不是完整的解决方案,您也想要删除第一个/最后一个引号:

grep page_footer /home/foobar/testfile.txt | sed -e 's/[^'\'']*'\''//' -e 's/'\''[^'\'']*$//'

在双引号字符串中编写sed参数并使用。用于匹配单引号的通配符将缩短行:

grep page_footer /home/foobar/testfile.txt | sed -e "s/^[^\']*.//" -e "s/.[^\']*$//"