У меня есть текстовый файл со следующими данными, и каждая строка заканчивается |END|
.
T|somthing|something|END|T|something2|something2|END|
Я tryig заменить |END|
с \n
новой строки с СЭД.
sed 's/\|END\|/\n/g' test.txt
Но он производит неправильный вывод, как показано ниже:
T
|
s
o
m
e
...
Но то, что я хочу, это:
T|somthing|something
T|something2|something2
Я тоже пробовал с tr
. Это тоже не сработало.
Ответы:
Использовать этот:
То, что вы пытались, не работает, потому что sed использует базовые регулярные выражения , а ваша реализация sed имеет
\|
оператор, означающий «или» (общее расширение BRE), поэтому то, что вы написали, заменяет (пустую строкуEND
или пустую строку) на новую строку.источник
\n
). Вопрос в том, как заменить|END|
на новую строку, а не на\n
.Следующее работало хорошо для меня:
Обратите внимание, что я просто поставил обратную косую черту, а затем клавишу ввода.
источник
\n
ответа «как в @ AB» не будет работать с некоторымиsed
реализациями.\|
чередование в регулярном выражении, но не\n
означает новую строку вs
замене?Вы можете использовать
awk
:-F'\\|END\\|'
установите разделитель полей на|END|
OFS='\n'
установить разделитель выходного поля на новую строку$1=$1
вызватьawk
реконструкцию$0
сOFS
разделителем полей1
является истинным значением, потому чтоawk
печатать всю строку вводаисточник
Другое возможно AWKКоманда и использование ее
RS
опции будет:Напечатает те записи (основанные на разделителе R ecord S awk), которые не являются пустыми (имеет хотя бы одно поле) для предотвращения печати пустых строк.
Проверено на этом входе:
Дает этот вывод:
Это очищается все пустые строки :) Если вы хотите , чтобы новые строки тоже заменить
$1=$1
с$0
командует:источник
$1=$1
объединяет последовательности пробелов в один пробел и возвращает false, если первое поле равно 0. Не имеет смысла. Вы, вероятно, хотитеawk 1 RS='\\|END\\|'
илиawk NF RS='\\|END\\|'
илиawk length RS='\\|END\\|'
здесь. Обратите внимание, что регулярное выражение RS требует gawk или mawkДругой способ
sed
- не печатать пустые строки:например, вход:
вывод:
то же самое с
ed
:источник
Как уже упоминалось здесь на Walter Мундта , мы можем достичь этого с помощью ANSI C строку в кавычках
Проверьте ссылку здесь выше для других альтернатив.
Вы также можете использовать следующий синтаксис, я не уверен, работает ли он на всех разновидностях Unix / Linux
источник
У меня была такая же проблема в строгой оболочке posix, я сделал это в два прохода с неиспользованным символом
источник