我有一个包含类似模式的文件
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
与GNUsed:
$ 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
默认情况下使用,不带-P
or-E
),这样的 a*
将匹配字面星号字符。这在 PCRE(或扩展正则表达式)中是不允许的。grep
因此,GNU正确地抱怨了这一点。
我认为你可能尝试做的是
$ grep -o '[^ ]*\.example\.com\>' file
abc.example.com
def.example.com
xyz.example.com
这使用非标准(但通常实现)-o
选项来提取以一些非空格字符开头的每个子字符串,后跟文字字符串.example.com
,最后m
以“单词”结尾。