Bash sed查找并替换匹配到第一个实例

时间:2014-06-23 05:30:45

标签: bash unix sed

我有一个字符串<TH bgcolor=#7070ff>DATAbase</th>,我想删除bgcolor=#7070ff之间使用

的“<TH and >
echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed "s/\<TH.*\>/<th>/"

然而,这会产生<th>而不是<TH> DATAbase </th>

任何人都可以向我解释为什么sed与'&gt;'的第二个实例相匹配请?

阅读sed manual我无法理解!

修改

echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed 's|\(<TH[^<]*>\)|<th>|g'

这似乎有效,但我不知道为什么......

2 个答案:

答案 0 :(得分:1)

你可以试试这个sed命令,

sed 's|<TH[^>]*>|<th>|g' file

<强>示例:

如果您想保留第一个<TH>

$ echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed 's/^\([^ ]*\)[^>]*\(.*\)$/\1\2/g'
<TH>DATAbase</th> 

如果你想用小写字母<TH>,那就试试吧,

$ echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed 's/^\([^ ]*\)[^>]*\(.*\)$/<th\2/g'
<th>DATAbase</th> 

更简单的一个没有捕获组,

$ echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed 's|<TH[^>]*>|<th>|g'
<th>DATAbase</th> 

<强>解释

  • <TH[^>]*><TH到下一个>字符的字符匹配零次或多次,后跟符号>。所以它匹配字符串<TH bgcolor=#7070ff>。此匹配的字符串已替换为<th>

答案 1 :(得分:0)

尝试:

echo '<TH bgcolor=#7070ff>DATAbase</th> ' | sed "s/<TH[\w =#[:alnum:]]*>/<th>/"