Проблема с командой замены - PullRequest
1 голос
/ 13 октября 2010

У меня проблема с командой замены.

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

{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 ]

1 голос
/ 13 октября 2010

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

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

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

0 голосов
/ 24 июня 2011

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

cat input.txt sed "s / {a [$ 1] = a [$ 1] FS $ 2} END {для (i in a) печати i, a [i]} / '{a [$ 1] = a [ $ 1] FS $ 2} END {для (i in a) печати i, a [i]} '/ g "

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

0 голосов
/ 13 октября 2010

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

0 голосов
/ 13 октября 2010

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

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

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

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 в строке замены вместо '.

...