Как правило, это команды, которые не предназначены для непосредственного вызова пользователем. /usr/libexec
раньше было более распространенным для этого.
Использование 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
Использование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
ничем.
сед:
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 — нет.
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
со следующей строкой (, т. е. текущей записью ), печатает ее и присваивает переменной пустое значение. =
в конце файла. 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.