Это удалит все )
из любой строки, содержащей ESCAPED
:
sed '/ESCAPED/s/)//g' filename
Чтобы изменить файл на месте:
sed -i.bak '/ESCAPED/s/)//g' filename
/ ESCAPED /
Выбираются только те строки, которые содержат ESCAPED
.
s /) // g
Для выбранных строк удаляются все )
.
Команда замены обычно выглядит как s / old / new /
, которая ищет регулярное выражение old
и заменяет его на new
. В нашем случае старый
- это )
, а новый
- это пустая строка. Следовательно )
удаляется. g
в конце команды указывает sed делать это для каждого появления )
в строке, а не только для первого.
В конвейере команды выполняются одновременно. В том-то и дело, что вывод одного подается другому в режиме реального времени.
Статус выхода команды известен только тогда, когда она возвращается. Если вы хотите, чтобы awk
обработал вывод foo
, а также получил доступ к его статусу выхода, вам нужно будет запуститьawk
послеfoo
после сохранения вывода foo
где-то вроде:
foo > file
awk -v "rc=$?" '{print rc, $0}' < file
В качестве альтернативы вы могли бы awk
запускать foo
сам по себе (ну, все еще через оболочку для интерпретации командной строки ), читать ее вывод (через канал через его cmd | getline
интерфейс наpopen()
)и получить статус выхода с помощью:
awk -v cmd=foo '
BEGIN {
while ((cmd | getline) > 0) {
print
}
rc = close(cmd)
print rc
}'
Однако обратите внимание, что способ awk
кодирования состояния выхода варьируется от одной awk
реализации к другой. В одних это статус прямо как возвращенный waitpid()
или pclose()
, в других это тот, что разделен на 256 (даже когда foo
убит сигналом )... хотя вы должны быть в состоянии полагайтесь на rc
равным 0 тогда и только тогда, когда команда была успешной.
В случае с gawk
, оно недавно изменилось .
Или вы могли бы передать статус выхода в конце через канал:
(foo; echo "$?") | awk '
{saved = $0}
NR > 1 {
# process the previous line
$0 = prev
print "output:", $0
}
{prev = saved}
END{rc = prev; print rc}'
(предполагая, что вывод foo
заканчивается символом новой строки, когда он не пустой (является действительным текстом )).
Или подается по отдельной трубе. Например, в Linux и с оболочкой, отличной от ksh93:
{ : extra pipe | { (foo 3<&-; echo "$?" > /dev/fd/3) | awk '
{print}
END {getline rc < "/dev/fd/3"; print rc}'
} 3<&0 <&4 4<&-; } 4<&0
Используйте команду type и так далее:
type test > /dev/null 2>&1
echo $?
0
type fsfsf > /dev/null 2>&1
echo $?
1