sed或grep中的两场比赛

时间:2015-02-01 22:37:18

标签: sed grep

我使用grep在以下两个命令中分别捕获id和名称:

echo "id=\"12345678_name\">myname</td>" | grep -oP "(?<=id=\\).*?(?=_name)"
echo "id=\"12345678_name\">myname</td>" | grep -oP "(?<=name).*?(?=<\/td)"

如何在单个grep或sed命令中完成整个操作?我需要关注输出:

12345678, myname

我是在命令行和Windows(6.2.9200)中使用GNU Sed版本4.2.1的批处理文件中执行此操作。

2 个答案:

答案 0 :(得分:0)

echo "id=\"12345678_name\">myname</td>" | sed -re 's~id=\"([0-9]+)_name\">([^<]+)</td>~\1, \2~g'

我使用sed搜索并替换。基本上,搜索字符串是整行,括号中的模式用于我们要提取的位,然后是替换字符串。

搜索:id=\"([0-9]+)_name\">([^<]+)</td>

替换为:\1, \2

\1()中的第一个模式,一个或多个数字。

\2()中的第二种模式,除了<

之外的任何模式

两种模式都在上下文中,因此会找到正确的文本。但是,此搜索字符串对于上下文非常严格。

答案 1 :(得分:0)

echo 'id=\"12345678_name\">myname</td>' |sed -r 's#id=\\"([[:digit:]]+)[^>]+>([[:alpha:]]+)</td>#\1, \2#g'