Shell中与PHP的preg_replace()函数相对应的函数是什么?

11

大家好。

我正在寻找一种在shell脚本中执行与PHP的preg_replace()相同操作的方法(搜索匹配正则表达式的文本并替换它)。

因此,请考虑以下文件。

<a href="http://example.com/">Website #1</a>
<a href="http://example.net/">Website #2</a>
<a href="http://example.org/">Website #3</a>

我想要得到这个:

http://example.com/
http://example.net/
http://example.org/

有没有一种方法可以做到这一点?谢谢。

您的文本与示例不同。您是想像示例中那样提取字符串的一部分,还是要实际替换它为其他内容? - plundra
1
此外,一般情况下,请勿使用正则表达式解析HTML(参考链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454)。 - user395760
如果你说:“那么,请考虑下面的文件。”,那么人们会认为它是数据。下次请提出一个合适的问题。 - Anders
@plundra 是的,抱歉。实际上你是对的,“extract”才是正确的词语。@delnan 我只想提取一些字符串... @Anders 你完全正确。 - seriousdev
2个回答

10

您可以使用sed

sed -r 's/.*href="([^"]*)".*/\1/' file

查看


太好了,谢谢!所以我认为s是告诉sed使用正则表达式,但\1/是什么意思? - seriousdev
不,s 是替换命令,\1 是第一个匹配项(组?不确定术语),1 是第一个括号内的内容。在上面的情况下是 [^"]* - plundra

0

虽然 sed 完全适用,但它不允许超过9个反向引用。Perl可以:

echo "a b c d e f g h i j k l m n o p q r s t u v w x y z" | \
    perl -lpe 's/(\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/$1;$2;$3;$4;$5;$6;$7;$8;$9;$10;$11;$12;$13;$14;$15;$16;$17;$18;$19;$20;$21;$22;$23;$24;$25;$26/g'
a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z

这个(愚蠢的)例子展示了可以比 sed\9 更进一步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接