Проблема с командой замены
Вопрос
У меня возникла некоторая проблема с командой 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 .(если только вы не знаете, где это находится).