Вопрос

У меня возникла некоторая проблема с командой replace.

Входной файл у меня есть такой

{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}

Я хочу заменить его одинарными кавычками

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

Используя приведенную ниже команду

find input.txt -exec sed 's/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'/g' {} \;

Я получаю ошибку, подобную этой

bash: syntax error near unexpected token `('
Это было полезно?

Решение 4

Наконец я нашел простой способ сделать это.

кошка input.txt sed "s/{a[$1]=a[$1]FS $ 2}END{для (i в a) выведите i,a[i]}/'{a[$1]=a[$1]FS $2}END{для(i в a) выведите i,a[i]}'/g"

Я надеюсь, что буду полезен

Другие советы

Во-первых, вы не можете легко вставить буквальную одинарную кавычку в аргумент, который разделен одинарными кавычками.
Вы должны заменить свой '"это с '"'"' или '\''.
В качестве подсказки, позволяющей угадать эту проблему, здесь жалоба исходит из командной оболочки, что означает, что даже ваша командная строка искажена.

Во-вторых, вы должны знать, что доллар и круглые скобки являются специальными символами в регулярных выражениях sed.Вероятно, вам придется сбежать от них.Читать man sed для получения более подробной информации об этом.

В-третьих, я не уверен, что find input.txt будет работать.Я думаю, ты имел в виду find . -type f -name input.txt?

Это потому, что голый ' в вашей заменяющей строке фактически завершается sed команда, означающая, что оболочка пытается обработать строку.На самом деле это сразу стало очевидно, когда правка Бенуа привела к тому, что ваш вопрос был правильно окрашен в синтаксический цвет.Вы можете увидеть второй ' в строке (первый символ текста подстановки) изменился цвет с красного на черный из-за завершения строки.

Кроме того,, sed не понравится использование голых [] поскольку они указывают классы символов в регулярных выражениях.

Вы можете устранить обе проблемы с помощью:

pax> find input.txt -exec sed 's/{a\[$1\]=a\[$1\]FS$2}END{for(i in a) print i,a\[i\]}/\x27{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}\x27/g' {} \;

какие результаты:

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

Итак, по сути, экранируйте квадратные скобки в строке поиска, чтобы они обрабатывались как литералы, и используйте \x27 в строке замены вместо '.

Я нахожу забавным, почему ты должен это делать.В первую очередь вы должны написать правильный код, так как я вижу его awk-код.Только не говори мне, что ты намеренно опустил одинарную кавычку в своем input.txt файл, когда вы его создали?И это всего лишь один файл, который вы редактируете.Нет необходимости использовать функцию find .(если только вы не знаете, где это находится).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top