在匹配模式后插入新行

在匹配模式后插入新行

我有一个包含类似模式的文件

abc.example.com def.example.com xyz.example.com

我希望输出位于每次example.com喜欢之后的下一行:

abc.example.com
def.example.com
xyz.example.com 

我尝试过grep -oP'(example.com$)'grep -oP'*.(example.com$)但没有得到想要的结果。对于第一个,我只得到example.com结果,每个结果都在新行中。对于第二个我收到错误quantifier does not follow a repeatable pattern

答案1

与GNU

$ sed -E 's/(\S+example\.com) /\1\n/g' file
abc.example.com
def.example.com
xyz.example.com

或者利用分词:

printf '%s\n' $(< file)

(如果你不关心匹配example.com

答案2

由于您似乎想用换行符替换空格,因此可以使用tr

$ tr ' ' '\n' <file
abc.example.com
def.example.com
xyz.example.com

或者,与sed

$ sed -e 'y/ /\n/' file
abc.example.com
def.example.com
xyz.example.com

关于您的尝试:

  • 第一个grep -oP'(example.com$)'(选项和实际表达式之间缺少空格-P,可以简化为)要求提取行尾grep -o 'example.com$'匹配的文本。example.com这就是它的作用。

  • 第二个grep -oP'*.(example.com$)(与第一个一样,选项和表达式之间缺少空格-P,并且还缺少结束单引号,并且可能会简化为grep -o -P '*.example.com$'),尝试*在表达式开头使用修饰符。这是合法的在一个基本的正则表达式(grep默认情况下使用,不带-Por -E),这样的 a*将匹配字面星号字符。这在 PCRE(或扩展正则表达式)中是不允许的。grep因此,GNU正确地抱怨了这一点。

我认为你可能尝试做的是

$ grep -o '[^ ]*\.example\.com\>' file
abc.example.com
def.example.com
xyz.example.com

这使用非标准(但通常实现)-o选项来提取以一些非空格字符开头的每个子字符串,后跟文字字符串.example.com,最后m以“单词”结尾。

相关内容