替换文本文件中的一行,但仅限于该行前面有特定的多行模式

替换文本文件中的一行,但仅限于该行前面有特定的多行模式

我的文件包含:

菠萝
苹果
香蕉
葡萄
西瓜
橙子
苹果
香蕉
芒果
李子
香蕉
樱桃

我想把它做成这样:

菠萝
苹果
香蕉
葡萄
西瓜
橙子
苹果
香蕉
橄榄
芒果
李子
香蕉
樱桃

我在这里从“Rice”更改为“Olive”,但仅限于“Rice”的出现遵循多行模式的匹配;特别是在多行模式之后出现“Rice”的地方:

橙子
苹果
香蕉

我愿意使用awkperlsed或任何其他工具。

答案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'将输入中的所有空格字符转换为换行符,将单行输入转换回原始格式,每行一个单词。

相关内容