我是正则表达式范例的新手,我遇到了一个我试图解决的问题,但没有成功。
假设一个文件 test.txt 包含:
hello everyone, whatsi up
i hope my program worksa
if it doesnt... ho well!
我想输出到另一个文件 output.txt 只有以辅音开头和以元音结尾的单词,所以它会导致:
hello whatsi
hope worksa
ho
我正在使用 grep -o '\b[^ aeiouAEIOU]\w*[aeiouAEIOU]\b' test.txt > output.txt
但是,-o
标志将每个匹配的字符串输出到一个新行。我应该怎么做才能获得我想要的格式?另一个有效的选择是使用 sed 将与该模式不匹配的所有内容替换为空格,但我也没有这样做。我应该改用 sed 还是 awk?
谢谢
最佳答案
您可以指示 grep
将输入视为一组以空字节终止的行,即,如果您的输入不包含空字节,则作为一个长行,使用 -z
/--空数据
标志。
这样你就可以保留换行符(注意 ...| |\n
最后):
$ grep -Pozi '\b[bcdfghjklmnpqrstvwxyz]\w*[aeiou]\b| |\n' file
hello whatsi
hope worksa
ho
但以出现空字节 (\x0
) 字符为代价(由于我们的正则表达式,还有多个空格)。这些可以用一些 sed
表达式来修复:
$ grep -Pozi '\b[bcdfghjklmnpqrstvwxyz]\w*[aeiou]\b| |\n' file \
| sed -E -e 's/\x0//g' -e 's/ +/ /g' -e 's/^ //' -e 's/ $//'
hello whatsi
hope worksa
ho
(一个去除空字节,一个用一个空格替换多个空格,两个去除前导和尾随空格)。
关于bash - 使用 grep 或 sed 替换不匹配模式的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589672/