Используя общий инструмент командной строки, такой как sed или awk, возможно ли объединить все строки, заканчивающиеся заданным символом, например, обратную косую черту?
Например, учитывая файл:
foo bar \
bash \
baz
dude \
happy
Я хотел бы получить этот вывод:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Кори Кляйн
источник
источник
cpp
:)sed
FAQОтветы:
более короткое и простое решение sed:
или однострочник при использовании GNU
sed
:источник
sed
:) ... Вы добавляете каждую строку непосредственно в пространство шаблонов, и когда появляется строка с "нормально законченным", все пространство шаблона падает и автоматически печатает (потому что нет опции -n) ... аккуратно! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
Возможно, это проще всего с perl (поскольку perl похож на sed и awk, я надеюсь, что он приемлем для вас):
источник
Вот решение awk. Если строка заканчивается на
\
, удалите обратную косую черту и напечатайте строку без завершающей строки; в противном случае выведите строку с завершающим символом новой строки.Это также не так уж плохо в sed, хотя awk явно более читабелен.
источник
Это не ответ как таковой. Это побочный вопрос о
sed
.В частности, мне нужно было
sed
разбирать команду Жиля на части по частям, чтобы понять это ... Я начал писать некоторые заметки об этом, а затем подумал, что это может быть кому-то здесь полезно ...так вот оно ... Сценарий Жиля Седа в документированном формате:
источник
Еще один распространенный инструмент командной строки
ed
, который по умолчанию изменяет файлы на месте и, следовательно, оставляет права доступа к файлам без изменений (дополнительную информациюed
см. В разделе « Редактирование файлов с помощью редактора ed текста из сценариев» ).источник
Используя тот факт, что
read
в оболочке будут интерпретировать обратные слеши при использовании без-r
:Обратите внимание, что это также будет интерпретировать любую другую обратную косую черту в данных.
источник
a\\b\\\\\\\\\\\c
Простое (r) решение, которое загружает весь файл в память:
Или еще короткая, которая понимает (выводит) строки (синтаксис GNU):
В одну строку (синтаксис POSIX):
Или используйте awk (если файл слишком большой, чтобы поместиться в памяти):
источник
Версия для Mac на основе решения @Giles будет выглядеть так
Где главное различие заключается в том, как представляются новые строки, и объединение любого дальнейшего в одну строку разбивает его
источник
Вы можете использовать cpp, но он генерирует несколько пустых строк, где объединяет вывод, и некоторое введение, которое я удаляю с помощью sed - возможно, это можно сделать с помощью cpp-flags и параметров:
источник
cpp
это решение? В вашем примереecho
строка с двойными кавычками уже выводит выпрямленный текст, поэтомуcpp
бессмысленно. (Это также относится к вашемуsed
коду.) Если вы помещаете строку в одинарные кавычки,cpp
просто удаляет обратную косую черту, но не объединяет строки. (Конкатенация сcpp
будет работать, если не будет пробела передcpp
этого до сих пор не объединяет строки для меня. И использованиеsed
определенно не нужно. Использованиеcpp -P
: «-P
Запретить генерацию линейных маркеров в выходных данных препроцессора». - man cppcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Аcpp --version
показываетcpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
- что? Ubuntu исправляет cpp? Зачем? Я бы ожидал прочитать GNU ...cpp
действительно объединяет строки и оставляет некоторые пробелы. Еще интереснее то, что здесь принимает ту же версию 4.4.3-4ubuntu5.1-P
. Однако это только устраняет маркеры строки, пустые строки остаются.