bash - 使用 grep 或 sed 替换不匹配模式的单词

标签 bash shell awk sed grep

我是正则表达式范例的新手,我遇到了一个我试图解决的问题,但没有成功。

假设一个文件 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/

相关文章:

bash - 如何使用 AWK 字符长度分隔列

image - 如何获取网站中所有图片的所有信息

linux - 在文件夹中制作 n 个文件副本并将它们复制到特定文件夹

bash - 读取行号指定的两行之间的行

bash - 差异-r : limit recursion?

linux - Bash:文本格式

linux - 满足以下要求的 shell 脚本

python - 过滤出现在两个标记之间的文本

linux - 识别单个 unix 目录中文本文件中的模式

parsing - 使用 awk 在 $4 和 $5 之间添加一列