2014-11-20 5 views
0

Я хочу выполнить эту команду в bash-скриптах.Выполнение команды sed в сценарии bash

Код:

#!/bin/bash 
line=39; 
d=d; ## For delete line 
`echo "sed '$line$d' /etc/passwd"`; 

Но когда я исполняю, я получил эту ошибку:

sed: -e expresion #1, character 1: unknow command <<'>> 

Я попытался с echo "sed \'$line$d\' /etc/passwd";

Но та же проблема ...

ответ

1

Вы должны страховать при вызове переменные, которые не мешают экспансию single-quoting их. Теперь можно использовать single-quotesв пределахdouble-quotes, но будьте внимательны. Кроме того, хотя это и не требуется, при двойном переносе двух переменных лучше использовать фигурные скобки, чтобы застраховаться от двусмысленности. Тем не менее, ваша sed команда из сценария работает отлично, как:

sed -e "${line}${d}" /etc/passwd 

, которые будут выводить /etc/passwd на stdout минус линия $line. Чтобы редактировать /etc/passwd в месте, используйте sed -i

+0

Я не думаю, что 'd' должен быть расширен, он хочет, чтобы удалить с помощью' sed' я считаю. Прямо сейчас нет даже команды 'sed' ... Проблема, мне кажется, заключалась в том, что он пытался закончить переменную долларом, а не инкапсулировать ее фигурными фигурными скобками. – ShellFish

+0

Посмотрите на код в 'pastebin' непосредственно перед вызовом' d = d' –

+0

Да, я пропустил эту часть, мой плохой. Это, безусловно, лучший ответ :) – ShellFish

1

Чтобы удалить строку 39 просто сделать:

#!/bin/bash 
line=39; 
sed -i "${line}d" /etc/passwd 

Sed примет второй аргумент в качестве входного файла и первый в качестве команды. Дополнительный флаг -i позволит вам перенаправить вывод сразу во входной файл. Обратите внимание, что это не то же самое, что и sed 'command' file > file, так как это приведет к пустым файлам.

Я также советую выполнить man sed в вашей оболочке.

+0

удалить 'line 39' откуда? выводить на 'stdout'? или в '/ etc/passwd'? –

+0

'/ etc/passwd' является входным файлом, проверьте его код в pastebin. – ShellFish

+0

Я сделал, sed 'foo'/etc/password работает только на' cat/etc/passwd'. Вы должны включить '-i' для' edit in place'. –

0
#!/bin/bash 

# delete line 39 by editing inline via sed; 
sed -i '39d' /etc/passwd 

Держите его простым и добавить комментарий, если вы хотите вспомнить SED действие

+0

Проблема в том, что я не знаю строку, я получаю подсчет числа строк в for и сравнении имен. – Guille

+0

в этом случае ответ @ShellFish в порядке – NeronLeVelu

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