我的文件包含:
菠萝 苹果 香蕉 米 葡萄 西瓜 橙子 苹果 香蕉 米 芒果 梨 李子 香蕉 米 樱桃
我想把它做成这样:
菠萝 苹果 香蕉 米 葡萄 西瓜 橙子 苹果 香蕉 橄榄 芒果 梨 李子 香蕉 米 樱桃
我在这里从“Rice”更改为“Olive”,但仅限于“Rice”的出现遵循多行模式的匹配;特别是在多行模式之后出现“Rice”的地方:
橙子 苹果 香蕉
我愿意使用awk
、perl
、sed
或任何其他工具。
答案1
Perl 很好地完成了这项工作:
perl -0pe 's/Orange\nApple\nBanana\n\KRice/Olive/' input.txt
您可以练习和测试正则表达式正则表达式101。
答案2
一种可能的解决方案:
paste -d' ' -s myfile \
| sed 's/\(Orange Apple Banana\) Rice/\1 Olive/g' \
| tr ' ' '\n'
解释:
paste -d' ' -s myfile
取每一行我的文件并将其连续粘贴(即在一行上),并用分隔符(空格)分隔。现在,您可以在一行上输入所有单词,而不是每行输入一个单词。
sed 's/\(Orange Apple Banana\) Rice/\1 Olive/g'
搜索输入并将每次出现的“Orange Apple Banana Rice”替换为“Orange Apple Banana Olive”。
tr ' ' '\n'
将输入中的所有空格字符转换为换行符,将单行输入转换回原始格式,每行一个单词。