Ответы:
Вы могли бы использовать awk
для этого.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>
печатает весь вывод в файл, перезаписывая существующие файлы. Это не оценивается таким образом, что это приведет к тому, что любые новые строки будут перезаписывать старый вывод из того же экземпляра awk
. То есть, если есть несколько совпадений, файл «совпадение» будет содержать каждое совпадение, разделенное OFS
. Разница между >
и >>
существует в обработке существующих файлов.
Вот sed
пример:
Примечание: w
команда sed будет перезаписывать существующий файл при каждом запуске сценария, но только если эта конкретная команда записи запущена; следовательноrm
rm -f file-{yes,not}
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
sed -n '/PATTERN/p;//! w file-not' infile >file-yes
Вы можете добавлять файлы в awk:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
или короче:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awk
но в какой момент он оценивает>
? Если его оценивать каждый раз, когда применяется условное условие, вы получите два однострочных файла ...