2013-08-21 4 views
0

Я использовал grep, чтобы выяснить, существует ли конкретная строка в файле или не нравится:СЕПГ команда выдает ошибку: SED: -e выражение # 1, символ 50: незавершенная команда `S'

my $grepval=`grep "$conn[$i]" filename`; 

который является правильным, но после этого я теперь хочу, чтобы удалить grepval из файла с использованием СЭД, как это:

sed -i "s/$grepval//g" filename`; 

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

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

SA291 КОД ОШИБКИ ---- >>> -3 ERROR_NO_RESULT_FOUND. Это мой $ grepval.I использовал другой разделитель и вот так: sed -i "s | $ grepval || g"/home /abc/Desktop/xyz.txt.but, но все равно дает мне ту же ошибку.

+0

есть, вероятно, '/' в '$ grepval' также может быть мультилинии –

+0

SA291 \t ERROR CODE ---- >>> -3 \t ERROR_NO_RESULT_FOUND .this мой $ grepval.I используется другой разделитель также выглядит так: 'sed -i 's | $ grepval || g" /home/abc/Desktop/xyz.txt'.but его все еще дает мне ту же ошибку – user2702225

+0

Вопрос в том, почему вы первый grep, чтобы получить строка, затем выполнить подстановку, чтобы избавиться от этой строки? А потом выложите «sed» внутри Perl? Sheesh. Откройте файл в perl, напечатайте строки до копии файла, но не печатайте строки, соответствующие вашему значению grep. Готово. – TLP

ответ

0

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

Сэмми

0

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

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`; 
} 
1

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

print "[$grepval]\n"; 

, и я гарантирую, что будет a / где-то, возможно, около символа № 48.

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

sed -i "s?$grepval??g" filename 
+0

Нет, нет/нет в grepval output.если есть эта ошибка – user2702225

1

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

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

sed -i "s|$grepval||g" filename 
+0

нет/в заменяющем шаблоне все еще есть эта ошибка. Есть ли другая альтернатива, кроме sed – user2702225

+0

@ user2702225 Показать больше вашего кода. – devnull

+0

if ($ html = ~ m #^(\ d +) \/(\ d +) $ #) {my $ grepval = 'grep" $ conn [$ i] "/ home/abc/Desktop/xyz.txt' ; if ($ grepval ne "") \t {'sed -e" s? $ grepval ?? g "/ home/abc/Desktop/xyz.txt';}, если я печатаю $ grepval, он дает этот вывод: SA291 \t ОШИБКА CODE ---- >>> -3 \t ERROR_NO_RESULT_FOUND, это нормально, но теперь я хочу удалить эту строку из xyz.txt, которая не происходит. Bcoz sed дает ошибку – user2702225

0

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

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

+0

Я использовал chomp, теперь его не давали никаких ошибок, но не удалив значение $ grepval из текстового файла. Я использовал 'sed -e '/ $ grepval // g'/home/abc/Desktop/xyz.txt'; пожалуйста, помогите – user2702225

+0

Где '-i' в командной строке sed? –

Смежные вопросы