Sed 或 awk - 在匹配模式后插入新行

Sed 或 awk - 在匹配模式后插入新行

我有一个包含多个 URL 的文件。但不幸的是,所有的 URL 都在一行中。

猫 url_file

http://transfer.sh/PIGfk/my-file.002554http://transfer.sh/Ep9Md/my-file.002555http://transfer.sh/Ep9Md/my-file.002556http://transfer.sh/Ep9Md/my-file.002557

预期输出:

http://transfer.sh/PIGfk/my-file.002554
http://transfer.sh/Ep9Md/my-file.002555
http://transfer.sh/Ep9Md/my-file.002556
http://transfer.sh/Ep9Md/my-file.002557

答案1

GNU grep

grep -oP 'http://.+?(?=http://|$)' url_file

答案2

使用perl

perl -pe 's#(?<=.)(?=http://)#\n#g' url_file

解释

这使用了一个积极的前瞻查找以 开头的子字符串http://并在其前面放置换行符 ( \n)。

它还使用一个积极的后视仅当 之前有一个字符时才匹配http://。这样,在一行中的第一个 url 之前就不会插入换行符。如果您最终有多行,这将非常方便。

更新

在 @steeldriver 的精彩评论之前,没有使用后视,我依赖于sed '1d'删除第一行。

答案3

您可以使用这个 GNUsed命令:

sed 's,http://,\n&,g' url_file | tail -n +2

它会查找模式http://并在其前面插入一个 CR。

tail -n +2跳过此 sed 命令插入的第一行(空)。

答案4

我通过以下3种方法完成了

python

    #!/usr/bin/python
    import re
    k=open('filename','r')
    for i in k:
        print re.sub("http","\nhttp",i)



perl

perl -pne "s/http/\nhttp/g" filename



sed command

sed "s/http/\n&/g" filename

输出

http://transfer.sh/PIGfk/my-file.002554
http://transfer.sh/Ep9Md/my-file.002555
http://transfer.sh/Ep9Md/my-file.002556
http://transfer.sh/Ep9Md/my-file.002557

相关内容