Bash 替换模式
我有以下代码:Bash 替换模式,bash,shell,sed,Bash,Shell,Sed,我有以下代码: <td nowrap="nowrap" width="74"> <p align="center">server1</p> </td> <td nowrap="nowrap" width="74"> <p align="center">server2</p> </td> 服务器1 服务器2 依此类推。我希望得到如下输出: <td nowrap="nowrap" width=
<td nowrap="nowrap" width="74">
<p align="center">server1</p>
</td>
<td nowrap="nowrap" width="74">
<p align="center">server2</p>
</td>
服务器1
服务器2
依此类推。我希望得到如下输出:
<td nowrap="nowrap" width="74">server1</td>
<td nowrap="nowrap" width="74">server2</td>
server1
服务器2
我的方法应该是什么?比如说文件是server.html
我做过这样的事情:
sed "s/<p align="center">*</p>/*/" -i server.html
sed“s/*
/*/”-i server.html
但是它不起作用。编写正则表达式来操作HTML并不是最好的方法。您应该查看HTML解析库,并在解析后编写代码来转换HTML。编写正则表达式来处理HTML不是最好的方法。您应该查看HTML解析库,并编写代码在解析后转换HTML。再次有人用正则表达式解析HTML。。。下面的命令似乎适用于您发布的特定示例:
sed -re 's/<p align="center">(.*?)<\/p>/\1/g'
sed-re的/(.*)/\1/g'
但是,如果有微小的变化,它会中断,考虑使用HTML解析器。< /P> 编辑:如果没有正则表达式,可以使用相同的结果执行以下操作:
sed -e 's/<p align="center">//g' -e 's/<\/p>//g'
sed-e的///p align=“center”>///g'-e的///g'
但它甚至比第一个更脏。再次有人用正则表达式解析HTML。。。下面的命令似乎适用于您发布的特定示例:
sed -re 's/<p align="center">(.*?)<\/p>/\1/g'
sed-re的/(.*)/\1/g'
但是,如果有微小的变化,它会中断,考虑使用HTML解析器。< /P> 编辑:如果没有正则表达式,可以使用相同的结果执行以下操作:
sed -e 's/<p align="center">//g' -e 's/<\/p>//g'
sed-e的///p align=“center”>///g'-e的///g'
但是它甚至比第一个更脏。当您将正则表达式与sed一起使用时,您可以使用
\X
引用第X个匹配的()
块
另外,由于表达式中到处都是斜杠,我将使用
作为sed分隔符,只是为了使表达式不那么不透明
sed -e "s|<p align=\"center\">\(.*\)</p>|\1|" server.html
sed-e“s|\(.*)
\1|“server.html
将正则表达式与sed一起使用时,可以使用\X
另外,由于表达式中到处都是斜杠,我将使用
作为sed分隔符,只是为了使表达式不那么不透明
sed -e "s|<p align=\"center\">\(.*\)</p>|\1|" server.html
sed-e“s|\(.*)
\1|“server.html
这是您的命令行
sed "s/<p align="center">*</p>/*/" -i server.html
使用正则表达式处理HTML通常会出现问题,但如果您只是处理有保证的可预测文本,AWK可能是一个合理的解决方案
#!/usr/bin/awk -f
/^<td/ { line=$0; }
/^<p/ { gsub(/<[^>]*>/,""); line=line $0; }
/^<\/td/ { print line $0; }
#/usr/bin/awk-f
/^ 这是您的命令行
sed "s/<p align="center">*</p>/*/" -i server.html
使用正则表达式处理HTML通常会出现问题,但如果您只是处理有保证的可预测文本,AWK可能是一个合理的解决方案
#!/usr/bin/awk -f
/^<td/ { line=$0; }
/^<p/ { gsub(/<[^>]*>/,""); line=line $0; }
/^<\/td/ { print line $0; }
#/usr/bin/awk-f
/^ 这可能适合您:
sed '/^<td nowrap="nowrap" width="74">$/{N;N;s/\n[^>]*>\([^<]*\)<\/p>\n/\1/}' file
<td nowrap="nowrap" width="74">server1</td>
<td nowrap="nowrap" width="74">server2</td>
sed'/^$/{N;N;s/\N[^>]*>\([^这可能适合您:
sed '/^<td nowrap="nowrap" width="74">$/{N;N;s/\n[^>]*>\([^<]*\)<\/p>\n/\1/}' file
<td nowrap="nowrap" width="74">server1</td>
<td nowrap="nowrap" width="74">server2</td>
sed'/^$/{N;N;s/\N[^>]*>\([^您遇到了什么错误?您是否先在命令行上尝试过这个方法?您可能还需要在最后使用/g来替换每行的多个结果。谢谢您ulmangt、ghoti和Lev。由@ulmangt提供的命令非常有效。但我非常欣赏ghoti的方法。我是否可以在此处选择多个答案?您只能在e、 但是,请随意向上投票。您会遇到什么错误?您是否先在命令行上尝试过这个方法?您可能还需要在最后使用/g来替换每行的多个结果。谢谢您的ulmangt、ghoti和Lev。@ulmangt提供的命令非常有效。但我真的很欣赏ghoti的方法。我有选择吗这里有多个答案?您只能接受一个,但可以随意在Shell中对所有您喜欢的.HTML paser进行升级。您能给我一些提示吗?还有我的缺点..我正在使用AIX.so no sed-r:(我想不是在bash中。就个人而言,我会使用Python,至少如果我必须对多个文件进行更改的话。sed
实际上取决于每一行的外观。如果您的标记在下一行关闭,而不是在同一行关闭,该怎么办?实际上,在没有-r
的情况下也可以这样做,就像ulmangt在Shell中显示的.HTML paser一样?可以你给了我一点提示?还有我的缺点..我正在使用AIX.so no sed-r:(我想不是在bash中。就个人而言,我会使用Python,至少如果我必须对多个文件进行更改的话。sed
实际上取决于每一行的外观。如果你的
标记在下一行关闭,而不是在同一行关闭,该怎么办?事实上,正如ulmangt所示,没有-r
也可以这样做。你是100%正确的。但是在这种情况下,正则表达式是一个安全的赌注,因为文件不会更改。您是100%正确的。但在这种情况下,正则表达式是一个安全的赌注,因为文件不会更改。您还可以通过使用单引号来避免转义双引号。sed-e的|\(.\)|\1 |'server.html
您还可以通过使用单引号避免转义双引号。sed-e的|\(.*)
|\1 |'server.html