Это больше имеет отношение к C и C++, чем Unix, и как таковой принадлежит ТАК.
Отвечать на Ваш вопрос, <>
указывает на заголовки в стандартной библиотеке и ""
библиотеки записаны специально для проекта.
От K&R:
Любая исходная строка формы
#include "имя файла"
или
#include <имя файла>
заменяется содержанием имени файла файла. Если имя файла заключается в кавычки, искание файла обычно начинается, где исходная программа была найдена; если не найдено там, или если в имя включают <и>, поиск следует определенному реализацией правилу найти файл. Включенный файл может самостоятельно содержать #include строки
Используйте следующее:
sed 's/|END|/\n/g' test.txt
То, что вы пытались сделать, не работает, потому что sed использует основные регулярные выражения , а в вашей реализации sed имеется оператор \|
, означающий "или" (общее расширение BRE), поэтому то, что вы написали, заменяется (пустая строка или END
или пустая строка) на новую строку.
Для меня это отлично сработало:
$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2
Заметьте, что я просто поставил обратный слеш, за которым следовала клавиша ввода.
Еще один способ с 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
Можно использовать 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
распечатать всю входную строкуДругая возможная команда awk и использование ее опции 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
У меня была такая же проблема в оболочке strict posix. Я сделал это за два прохода с неиспользованным символом
cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
Как упоминалось здесь Вальтером Мундтом , мы можем добиться этого, используя строку в кавычках 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
~ $