Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 替换模式_Bash_Shell_Sed - Fatal编程技术网

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