我有一个文本文件,有数千行,包含 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 行一组。
要修复该文件,我需要:
- 搜索每一行仅有的ASCII 字符。
- 测试下面这行是否包含仅有的非 ASCII。
- 如果是,请在 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
为真条件,这种情况下默认操作是打印。 - 然后,如果它不是(
!
)完全 ASCII(/^[\x01-\x7F]*$/
),则跳过处理更多规则(继续下一行,但处理来自 1 的规则)。 - 如果它完全是 ASCII,我们将得到下一行
{getline}
,如果其中没有!
任何 ASCII 字符/[\x01-\x7F]/
,则打印占位符。 - 最后使用 打印我们读到的行
getline
。
我假设您的 日本語のみ 行没有半角空格或标点符号(. !
vs 。 !
)。