使用'sed'或其他类似命令捕获组,然后仅输出该数据

时间:2013-09-19 22:20:16

标签: linux bash sed awk

我有一个如下所示的日志文件:

 sdfsdf
 sdfsdf<Pay>1234</Pay> sdfsdfsdf
 sdfsdf<Pay>12342323</Pay> sdfsdfsdf
 sdfsdf

... 我只想打印出来:

1234
12342323

我正在考虑使用'sed'并拥有以下一行:

sed 's/<Pay>(*)<\/Pay>/\1/g' abc.txt

但我收到错误:

sed:-e表达式#1,字符22:'s'命令的RHS上的无效引用\ 1

如何实现所需的输出?

这是Ubuntu Linux最新版,bash。

4 个答案:

答案 0 :(得分:4)

sed -n 's/.*<Pay>\(.*\)<\/Pay>.*/\1/p' file

答案 1 :(得分:2)

grep -o的完美案例:

grep -oP '(?<=<Pay>).+?(?=</Pay>)'

答案 2 :(得分:0)

与Perl相反,

sed需要转义它的捕获括号:\(.*\)

为了获得预期的输出,你需要摆脱余下的线路。只需将其包含在模式中即可。

答案 3 :(得分:0)

使用awk(由于RS中的正则表达式,只有gawkmawk

awk 'NR%2==0' RS="</?Pay>" file
1234
12342323