如何进行条件搜索和替换,以在具有不同匹配条件的两行之间添加一行?

如何进行条件搜索和替换,以在具有不同匹配条件的两行之间添加一行?

我有一个文本文件,有数千行,包含 ASCII 和非 ACII 字符。它是应该遵循某种模式

First line: only non-ASCII characters
Second line: only non-ASCII characters
Third line: only ASCII characters
Fourth line: mix of ASCII and non-ASCII characters

不幸的是,实际情况是它看起来像下面的例子,中间缺少混合 ASCII 和非 ASCII 字符的行:

日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
日本語のみ
日本語のみ
English words only
English and 日本語

幸运的是,据我所知,仅有的混合了 ASCII 和非 ASCII 字符的行有时会消失。这意味着本来应该是 4 行一组的行有时却只有 3 行一组。

要修复该文件,我需要:

  1. 搜索每一行仅有的ASCII 字符。
  2. 测试下面这行是否包含仅有的非 ASCII。
  3. 如果是,请在 ASCII 行后插入一个占位符行。

结果应该是:

日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
+Aあ+
日本語のみ
日本語のみ
English words only
English and 日本語

(我选择制作占位符+Aあ+,以便它符合它所代表的 ASCII 和非 ASCII 的混合。)

我发现我可以使用 sed 插入新行 sed -e "/this is already text/a\'this is a new line'" < file.text。我还了解到我可以使用 sedLC_ALL=C和来搜索 ASCII 字符[\d0-\d127]

但是,我不清楚如何将条件与搜索分开。我的意思是,我可以在每个 ASCII 字符实例后插入一行,但是如何进行搜索,在找到所有 ASCII 行时插入一行下一行仅非 ASCII?

请注意,我并不特别喜欢使用 sed。如果可以使用 Gedit、LibreOffice 或任何命令行操作提供答案,那就太好了。

答案1

根据您最近的问题,听起来您有一个XY问题

以下是基于@Zanna 对您上一个问题的回答的 sed 解决方案如何在文件中搜索仅包含 ASCII 字符的行然后对其采取操作?

$ LC_ALL=C sed -E '/^[\d0-\d127]+$/ {$!N; s/\n[^\d0-\d127]+$/\n+Aあ+&/;}' file
日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
+Aあ+
日本語のみ
日本語のみ
English words only
English and 日本語

答案2

使用 awk:

awk '1; ! /^[\x01-\x7F]*$/ {next} {getline} !/[\x01-\x7F]/ {print "+Aあ+"} 1'
  1. 无条件打印输入行 -1为真条件,这种情况下默认操作是打印。
  2. 然后,如果它不是(!)完全 ASCII(/^[\x01-\x7F]*$/),则跳过处理更多规则(继续下一行,但处理来自 1 的规则)。
  3. 如果它完全是 ASCII,我们将得到下一行{getline},如果其中没有!任何 ASCII 字符/[\x01-\x7F]/,则打印占位符。
  4. 最后使用 打印我们读到的行getline

我假设您的 日本語のみ 行没有半角空格或标点符号(. !vs 。 !)。

相关内容