Как «условно» удалить новые строки с помощью sed или awk и т. д.?

Как правило, это команды, которые не предназначены для непосредственного вызова пользователем. /usr/libexecраньше было более распространенным для этого.

2
17.12.2020, 14:18
4 ответа

Использование sedдля обнаружения строк, оканчивающихся на =. Когда такая строка найдена, следующая строка добавляется к текущей строке в буфере редактирования с символом новой строки, разделяющим их, =и символ новой строки удаляются, и печатается объединенная строка.

$ cat file
Apple
Banana milkshake
Cherry =
Pie
$ sed '/=$/ { N; s/=\n//; }' file
Apple
Banana milkshake
Cherry Pie

Обратите внимание, что это не работает с несколькими последовательными строками, заканчивающимися на =. Чтобы справиться с ними, процесс должен быть повторен (промежуточные результаты могут быть сохранены во временный файл, в исходный файл или просто снова переданы той же команде ).

... или вы можете сделать явный цикл вsed:

sed -e ':again' -e '/=$/ { N; s/=\n//' -e 'b again' -e '}' file

Тестирование:

$ cat file
Apple
Banana milkshake
Pie =
with a cherry =
on top
$ sed -e ':again' -e '/=$/ { N; s/=\n//' -e 'b again' -e '}' file
Apple
Banana milkshake
Pie with a cherry on top
6
18.03.2021, 22:42

Использованиеawk:

$ awk '{ORS = sub(/=$/,"") ? "" : "\n"} 1' file
Apple
Banana milkshake
Cherry Pie

Используя условное выражение, мы устанавливаемORS(разделитель выходных записей, по умолчанию :новую строку )либо на пустую строку, либо на новую строку. sub()истинно, когда в конце строки была произведена замена, удаляющая существующее =, в противном случае оно ложно. В первом случае мы устанавливаем ORSна ""или на "\n". 1означает печать строки (, используя значение ORS, выбранное для каждой строки ).


В качестве альтернативы мы могли бы использовать GNU sedи нулевое разделение, предполагая, что файл не огромен и достаточно мал для памяти:

sed -z 's/=\n//g' file

sedчитает весь файл как одну строку и глобально заменяет =\nничем.

8
18.03.2021, 22:42

сед:

sed -e ':a' -e '$!N;s/=\n//;t a' -e 'P;D' file

GNU-сед:

sed ':a;N;s/=\n//;ta;P;D' file

GNU awk:

awk '1' RS='=\n' ORS= file

перл:

perl -pe 's/=\n//' file

Если последняя строка ввода заканчивается на =<newline>, awk или perl удалит ее, а sed — нет.

3
18.03.2021, 22:42

I wish to join each line ending with = with the next line.

обновлено

awk '/=$/ {line=line $0;sub(/=$/,"",line);next}{$0= line $0;print $0;line=""} END{if (line) print line}' file
Apple
Banana milkshake
Cherry Pie

Также тестировалось соединение каждой строки (записи ), заканчивающейся на =, со следующей строкой или объединение нескольких последовательных строк (записей ), заканчивающихся на =, со следующей строкой. Строка или строки с =находятся в конце файла или нигде (нет)

этот код:

  • первая часть кода (передnext)объединяет строки с =и сохраняет их в var lineи sub()заменяет =на ""или пустую строку (удаляет ее ).
  • вторая часть (послеnext)объединяет содержимое переменной lineсо следующей строкой (, т. е. текущей записью ), печатает ее и присваивает переменной пустое значение.
  • часть END печатает эту запись или записи с =в конце файла.
  • Оператор next. Здесь строки, которые не соответствуют /=$/, вместо этого будут обрабатываться вторым блоком кода. Но если файл заканчивается строкой (или другими строками )с =, второй блок кода не выполняется, но мы можем напечатать эту строку или строки в части END.

Например, все это мы можем попробовать со следующими данными предполагаемого рецепта:

cat supposed-recipe.txt 
Cherry Pie Smoothie. =
This cherry smoothie =
tastes just like...

Ingredients:
Greek yogurt, plain non-fat, =
unsweetened milk, =
unsalted cashews,  =
etc.

And also:
1 pinch salt, =
and oats.
1 teaspoon =
vanilla extract,
fresh =
lemon juice.
1 teaspoon =
cinnamon, =
and frozen =
sweet cherries.

Optional:
2 teaspoons =
syrup or honey, =
to sweeten if wanted.

...and, if you want,
1 teaspoon chia seeds =
or similar. =
awk '/=$/ {line=line $0;sub(/=$/,"",line);next}{$0= line $0;print $0;line=""} END{if (line) print line}' supposed-recipe.txt

Cherry Pie Smoothie. This cherry smoothie tastes just like...

Ingredients:
Greek yogurt, plain non-fat, unsweetened milk, unsalted cashews,  etc.

And also:
1 pinch salt, and oats.
1 teaspoon vanilla extract,
fresh lemon juice.
1 teaspoon cinnamon, and frozen sweet cherries.

Optional:
2 teaspoons syrup or honey, to sweeten if wanted.

...and, if you want,
1 teaspoon chia seeds or similar.

1
18.03.2021, 22:42

Теги

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