это работает, как я ожидал:

$ cat in
abc 123
$ sed -E -i .bk 's/[0-9]+/(&)/' in
$ cat in 
abc (123)
$ cat in.bk
abc 123 

Но не это:

$ cat in
abc 123
$ sed -E 's/[0-9]+/(&)/' in 
abc (123)
$ sed -E 's/[0-9]+/(&)/' in > in
$ cat in 

Как я могу изменить вышеприведенный набор команд таким образом, чтобы вместо них возвращалась последняя команда:

abc (123)

?

2 ответа2

1

Вопрос: Изменение файла с помощью sed с помощью перенаправления.

Ответ: очевидно, ключ -i был добавлен в sed по причине. Простое использование перенаправления оставляет вас в поисках несколько запутанного решения.

cat in | cat - | sed -E 's/[0-9]+/(&)/' > in

Следующее также работает, но только если входной файл содержит одну строку:

cat in | parallel 'echo {} | sed -E "s/[0-9]+/(&)/" > in'

sed -E 's/[0-9]+/(&)/' in | parallel 'echo {} >in'

Объяснение: Объяснение дано Пауло в его комментарии к вопросу (перенаправление интерпретируется до выполнения команды). Мой обходной путь - добавить уровень косвенности между чтением файла и обратной записью в него.

0
sed -i -E 's/[0-9]+/(&)/' in

С другой стороны,

sed -E 's/[0-9]+/(&)/' in | tee in

перезаписывает файл и выдает вывод на стандартный вывод.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .