С помощью sed
можно сделать
sed -E 'N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename
-E
для использования расширенных регулярных выражений, облегчающих чтение N
добавляет следующую строку в буфер s/(.*)(\n) */\2\1/
объединяет строки, перемещая новую строку в начало и удаляя отступы пробелов /.{81}/
действителен для строк, содержащих более 80 символов; в этом случае выполните s_^(.)(.{,79}[-+/*]) *_\2\1_
, чтобы переместить разрыв строки на последний символ /^\n/!P
если первая строка в буфере не пуста, вывести ее D
начать заново с остатком буфера Как указал mosvy, этот скрипт имеет проблему с обратными косыми чертами в конце строки, поэтому их, вероятно, следует удалить с помощью s/\\$//
. Кроме того, если бы могли быть более длинные строки ввода (, что не является проблемой OP, но, возможно, каким-то будущим читателем ), можно было бы заменить N
на /.{80}/!N
. Таким образом, весь сценарий будет
sed -E 's/\\$//;/.{80}/!N;s/(.*)(\n) */\2\1/;/.{81}/s_^(.)(.{,79}[-+/*]) *_\2\1_;/^\n/!P;D' filename
Мне удалось решить эту проблему с помощью комбинации операторов перенаправления оболочки, утилитыtee
и параметра оболочкиpipefail
:
set -o pipefail; somecommand 2&>1 | tee./artifact.txt; set +o pipefail
В основном это:
stderr
из stdout
с2&>1
(или его сокращением |&
), которое затем передается как stdin
в tee
с tee
, который копирует свой stdin
в stdout
при создании копии в artifact.txt
. Мне пришлось смириться с тем, что и stdout
, и stderr
копировались в файл, потому что, по-видимому, в Bash нет сокращенного синтаксиса, позволяющего передавать только stderr
во вторую команду.
Другие ссылки:
В bash
вы можете запустить:
$ somecommand 2>&1 | tee./artifact.txt;echo "${PIPESTATUS[@]}"
И получить коды выхода по всему каналу.