Как я делаю условный поиск и замену, которая добавит строку между двумя строками с различными критериями соответствия?

У меня есть текстовый файл много тысяч строк долго с ASCII и non-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, "/это существующий текст/a \'this, новая строка'" <file.text. И я узнал, что могу искать символы ASCII с использованием sed LC_ALL=C и [\d0-\d127].

Однако я неясен о том, как сделать условное выражение отдельным от поиска. Я имею в виду, я мог вставить строку после каждого экземпляра ASCII только символы, но как я делаю поиск, который вставляет строку, когда вся строка ASCII найдена, и следующей строкой является только неASCII?

Обратите внимание на то, что я не слежу за использованием sed. Если бы ответ может быть предоставлен с помощью Gedit, LibreOffice или какой-либо операции командной строки, которая была бы большой.

0
задан 26 April 2018 в 22:44

2 ответа

На основе Ваших недавних вопросов это кажется, что у Вас есть проблема XY

Вот sed решение на основе ответа @Zanna на Ваш предыдущий вопрос, Как я ищу строки в файле, которые только содержат символы 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
ответ дан 30 October 2019 в 01:00

Используя 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.

Я предполагаю, что Ваши 日本語のみ строки не имеют пробелов полуширины или пунктуации (. ! по сравнению с 。 !).

2
ответ дан 30 October 2019 в 01:00

Другие вопросы по тегам:

Похожие вопросы: