Самый простой подход:
grep -E '^[0-9]+$' file | diff file -
Дефис -
в качестве имени файла представляет собой специальную запись, которая говорит diff
«использовать стандартный ввод»; это задокументировано на справочной странице diff
. (Большинство распространенных утилит поддерживают одинаковые обозначения.)
Причина, по которой обратные пометки не работают, заключается в том, что они фиксируют выходные данные команды и передают ее в качестве аргумента . Например, это:
cat `echo file`
эквивалентно этому:
cat file
и это:
diff file "`cat file | grep -E ^[0-9]+$`"
эквивалентно примерно так:
diff file "123
234
456"
То есть фактически он пытается передать 123234345
(плюс новые строки) как имя файла , а не как содержимое файла. Технически, вы могли бы добиться последнего, используя функцию «подстановки процессов» Bash, которая фактически создает своего рода временный файл:
diff file <(cat file | grep -E '^[0-9]+$')
но в вашем случае это не нужно, потому что diff
поддерживает -
.