Команда sed дает ошибку: sed: -e выражение # 1, команда char 50: unterminated ‘s

Вопрос: Я использовал grep чтобы узнать, существует ли конкретная строка в файле или нет: my $grepval='grep "$conn[$i]" filename'; что правильно, но после этого я теперь хочу удалить grepval из файла с помощью sed, как это: sed -i "s/$grepval//g" filename'; который дает мне ошибку sed: -e expression #1, char 50: unterminated s 'command'. Пожалуйста, помогите, как

Вопрос:

Я использовал grep чтобы узнать, существует ли конкретная строка в файле или нет:

my $grepval=’grep «$conn[$i]» filename’;

что правильно, но после этого я теперь хочу удалить grepval из файла с помощью sed, как это:

sed -i «s/$grepval//g» filename’;

который дает мне ошибку sed: -e expression #1, char 50: unterminated s ‘command’. Пожалуйста, помогите, как решить it.thanks

там, вероятно, в/в $ grepval также может быть многострочный – RC. 39 минут назад

SA291 ERROR CODE—- >>> -3 ERROR_NO_RESULT_FOUND. Это мой $ grepval.I также использовал другой разделитель, например: sed -i “s | $ grepval || g”/home/abc/Desktop/xyz. txt.but, но все еще дает мне ту же ошибку.

Лучший ответ:

Для внесения изменений в файл вам придется использовать sed -i вместо sed -e. -e используется для выражений, тогда как -i требуется, когда вам нужно изменить файлы и сохранить их после модификации.. также chomp также будет работать, чтобы решить эту проблему.. Grepval var может быть символом новой строки в конце.

Сэмми

Ответ №1

Поместите это в свой код непосредственно перед вызовом sed:

print «[$grepval]n»;

и я гарантирую, что там будет / там где – то, вероятно, около символьного номера 48.

Один из способов его решения состоит в том, чтобы предварительно обработать $grepval чтобы вы превратили его в правильно отформатированную строку поиска для sed или, если возможно, выберите разделитель, который, как вы знаете, не будет отображаться в строке (sed позволяет разные разделители):

sed -i «s?$grepval??g» filename Ответ №2

Если замена/шаблон содержит /, то вы не можете использовать / в качестве разделителя.

Используйте другой разделитель:

sed -i «s|$grepval||g» filename Ответ №3

вы можете получить список имен файлов, содержащих указанную строку

my @files = qx#grep -l $search_string $filenameExpression#; foreach my $f ( @files ) { chomp($f); # make sure your input doesn’t have slash «/» then use hash «#» my $ret = ‘perl -pi -e’s#$search_string##g’ $f’; } Ответ №4

Там $grepval в $grepval (или другой “скрытый” символ). Избавьтесь от него с помощью chomp.

Также вы можете использовать форму списка system() чтобы избежать проблем с метасимволами оболочки (просто вставлять аргументы в «» всегда не помогает) и попытаться избежать возможных метасимволов regexp с помощью quotemeta() чтобы получить скрипт более надежным. Еще лучше сделать все это в Perl. Например, sed -i не переносится и работает, вероятно, только в системах Linux.

Оцените статью
Добавить комментарий