2015-10-09 5 views
2

Мне нужно удалить строку в файле из сценария оболочки.Невозможно удалить строку в файле в сценарии оболочки

Я пытаюсь это:

linenumber=0 
##CHeck If server IP exists 
if grep -wq $serverip $FILE; then 
     echo "IP exists" 
     linenumber=$(awk -v serverip="$serverip" '$0 ~ serverip {print NR}' $FILE) 
     echo "$linenumber" 
     sed -e '${$linenumber}d' $FILE 

fi 

В основном я извлекаю номер строки, а затем удалить его.

sed -e '1d' $FILE --> WOrks on CLI but inside script does not work 

Почему? Как заставить его работать?

+0

Возможно, вы хотите использовать 'sed -i', который изменяет файл вместо того, чтобы печатать результат в stdout? –

ответ

3

Это просто случай использования неправильных котировок вокруг команды sed, поэтому переменная не используется. Не обращая внимания на тот факт, что вы излишне с помощью 3 инструментов при 1 будет достаточно, исправить это:

sed -e "${linenumber}d" "$FILE" 

Возможно, ваше требование является более сложным, чем кажется, но я хотел бы предложить изменения весь сценарий к этому:

awk -v serverip="$serverip" '!($0 ~ serverip)' "$FILE" 

Это печатает каждую строку, которая не содержит переменную оболочки $serverip. Предполагается, что вы избежали метасимволов регулярных выражений, присутствующих в переменной.

В качестве альтернативы (и более лаконично):

sed "/$serverip/d" "$FILE" 

Если вы действительно хотите, чтобы сообщения распечатывается (я предположил, что они были для отладки), то это достаточно легко достичь:

awk -v serverip="$serverip" '$0 ~ serverip { print "IP exists"; print NR; next } 1' "$FILE" 

Если вы не знакомы с 1 в конце, это просто сокращенная строка, которая вызывает awk для печати каждой строки (1 всегда верна, а действие по умолчанию - { print }).

+1

Или, sed вместо awk: 'sed '/ $ serverip/d" "$ FILE" '- то же предостережение о метахарах регулярных выражений. –

+0

По умолчанию я всегда использую awk, но да, это, наверное, лучше, спасибо. –

+1

Я согласен: как только я набираю ';' в sed-скрипт, я думаю об использовании другого инструмента. –