Как заменить слово новой строкой

Это больше имеет отношение к C и C++, чем Unix, и как таковой принадлежит ТАК.

Отвечать на Ваш вопрос, <> указывает на заголовки в стандартной библиотеке и "" библиотеки записаны специально для проекта.

От K&R:

Любая исходная строка формы

#include "имя файла"

или

#include <имя файла>

заменяется содержанием имени файла файла. Если имя файла заключается в кавычки, искание файла обычно начинается, где исходная программа была найдена; если не найдено там, или если в имя включают <и>, поиск следует определенному реализацией правилу найти файл. Включенный файл может самостоятельно содержать #include строки

10
03.04.2015, 15:12
7 ответов

Используйте следующее:

sed 's/|END|/\n/g' test.txt

То, что вы пытались сделать, не работает, потому что sed использует основные регулярные выражения , а в вашей реализации sed имеется оператор \|, означающий "или" (общее расширение BRE), поэтому то, что вы написали, заменяется (пустая строка или END или пустая строка) на новую строку.

14
27.01.2020, 19:59

Для меня это отлично сработало:

$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2

Заметьте, что я просто поставил обратный слеш, за которым следовала клавиша ввода.

7
27.01.2020, 19:59

Еще один способ с SED , который не печатает пустые строки:

sed 's/|END|/\
/g;/^$/!P;D' infile

E.G. Вход:

T|one|two|END|T|three|four|END|
T|five|six|END|T|seven|eight|END|
T|nine|ten|END|T|eleven|twelve|END|

Вывод:

T|one|two
T|three|four
T|five|six
T|seven|eight
T|nine|ten
T|eleven|twelve

То же самое с ed :

ed -s infile <<'IN'
1,$j
s/|END|/\
/g
,p
q
IN
2
27.01.2020, 19:59

Можно использовать awk:

$ awk -F'\\|END\\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
  • -F'\\|END\\|' установите разделитель полей на |END|
  • OFS='\n' установите новый разделитель полей на новую строку
  • $1=$1, потому что awk реконструирует $0 с OFS, так как разделитель полей
  • 1 является истинным значением, причинаawk распечатать всю входную строку
5
27.01.2020, 19:59

Другая возможная команда и использование ее опции RS будет следующим:

awk '$1=$1' RS="\|END\|" file

Будет печатать те записи (на основе эпаратора awk Record Separator), которые не являются пустыми (имеет по крайней мере одно поле), чтобы предотвратить печать пустых строк.

Проверено на этом входе:

T|somthing|something|END|T|something2|something2|END|
Test|END|
|END|

Дает этот вывод:

T|somthing|something
T|something2|something2
Test

Который очищает все пустые строки :) Если вы тоже хотите иметь новые строки, замените $1=$1 на $0 в команде:

awk '$0' RS="\|END\|" file
3
27.01.2020, 19:59

У меня была такая же проблема в оболочке strict posix. Я сделал это за два прохода с неиспользованным символом

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
1
27.01.2020, 19:59

Как упоминалось здесь Вальтером Мундтом , мы можем добиться этого, используя строку в кавычках ANSI C

sed $'s/|END|/\\\n/g'

~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed 
$'s/|END|/\\\n/g'
T|somthing|something
T|something2|something2

~ $

Прочтите приведенную выше ссылку, чтобы узнать о других альтернативах.

Вы также можете использовать следующий синтаксис, я не уверен, что он работает на всех разновидностях Unix/Linux

sed 's/|END|/\'$'\n''/g'

~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed 
's/|END|/\'$'\n''/g'
T|somthing|something
T|something2|something2

~ $
1
27.01.2020, 19:59

Теги

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