Удалить символ новой строки, если ему предшествует определенный символ на непоследовательных строках - PullRequest
2 голосов
/ 13 июня 2019

У меня есть текстовый файл, каждая строка которого заканчивается символом%. Я хочу найти шаблон "% + newline" и заменить его на "%". Другими словами, я хочу удалить символ новой строки сразу после%, а не другие символы новой строки.

Например, я хочу изменить следующее:

abcabcabcabc%
123456789123
abcabcabcabc%
123456789123

до

abcabcabcabc%123456789123
abcabcabcabc%123456789123

Я попробовал следующую команду sed, но безрезультатно.

sed 's/%\n/%/g' < input.txt > output.txt

Ответы [ 3 ]

3 голосов
/ 13 июня 2019

По умолчанию sed не может удалять символы новой строки, потому что он читает по одной строке, разделенной новой строкой, за раз.

С любым awk в любой оболочке на каждом блоке UNIX для любого количества строк, заканчивающихся на %, последовательных или нет:

$ awk '{printf "%s%s", $0, (/%$/ ? "" : ORS)}' file
abcabcabcabc%123456789123
abcabcabcabc%123456789123

и с последовательными % строками:

$ cat file
now is the%
winter of%
our%
discontent

$ awk '{printf "%s%s", $0, (/%$/ ? "" : ORS)}' file
now is the%winter of%our%discontent
2 голосов
/ 13 июня 2019

Ваш образец данных подразумевает, что нет нескольких последовательных строк, заканчивающихся на %.

. В этом случае вы можете использовать

sed '/%$/{N;s/\n//}' file.txt > output.txt

. Это работает следующим образом:

  • /%$/ - находит все строки, заканчивающиеся %
  • {N;s/\n//} - блок:
    • N - добавляет новую строку в пространство образца, затемдобавляет следующую строку ввода в пространство шаблона
    • s/\n// - удаляет новую строку в текущем пространстве шаблона.

См. онлайнsed демо .

0 голосов
/ 13 июня 2019

В переносимом модуле sed, поддерживающем любое количество строк:

parse.sed

:a                # A goto label named 'a'
/%$/ {            # When the last line ends in '%'
  N               # Append the next line
  s/\n//          # Remove new-line
  ta              # If new-line was replaced goto label 'a'
}

Запустите это так:

sed -f parse.sed infile

Вывод, когда infile содержит ваш ввод и ответ от Эда Мортона:

abcabcabcabc%123456789123         
abcabcabcabc%123456789123
now is the%winter of%our%discontent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...