Ошибка в sed

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

spool
Сообщения: 126
ОС: CentOS 6.6

Ошибка в sed

Сообщение spool » 28.01.2014 21:41

Приветствую. Имеется конструкция вида

Код: Выделить всё

sed -i "/$line/d" file.txt

При выполнении получаю ошибку

Код: Выделить всё

sed: -e expression #1, char 14: unknown command: `/'

Что сие значит? Странно, что на домашнем скрипт отлично отрабатывает, но на другом компе получаю то, что выше. Подскажите, пож, что за чудо?

PS: Полный скрипт, если нужно

Код: Выделить всё

cat $2/$4.txt | while read line
do
sed -i "/$line/d" $2/file.cfg
done
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Ошибка в sed

Сообщение /dev/random » 28.01.2014 21:52

В $line, случайно, символов / нет?
Спасибо сказали:

spool
Сообщения: 126
ОС: CentOS 6.6

Re: Ошибка в sed

Сообщение spool » 28.01.2014 21:54

/dev/random писал(а):
28.01.2014 21:52
В $line, случайно, символов / нет?

Есть. Там строки вида
строка 1 //это строка 1
строка 2 //это строка 2
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.01.2014 21:54

spool писал(а):
28.01.2014 21:41
sed: -e expression #1, char 14: unknown command: `/'

у вас переменная $line раскрылось нечто со слешами. Вангую вот в это:

$

$ echo "$line" http://unixforum.org/ $ sed "/$line/d" sed: -e выражение #1, символ 8: неизвестная команда: `/'


зачем вам тут регулярки? Используйте

$

grep -v "$line"



PS: на край можете так:

Код: Выделить всё

sed "\~$line~"

это спасёт от слешей, но всё остальное останется...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

spool
Сообщения: 126
ОС: CentOS 6.6

Re: Ошибка в sed

Сообщение spool » 28.01.2014 21:57

drBatty, мне нужно читать строки из файла $4.txt и удалять их из файла file.cfg. Каким образом я могу с помощью grep -v "$line" или sed "\~$line~" удалить из файла?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Ошибка в sed

Сообщение /dev/random » 28.01.2014 22:04

spool писал(а):
28.01.2014 21:54
/dev/random писал(а):
28.01.2014 21:52
В $line, случайно, символов / нет?

Есть. Там строки вида
строка 1 //это строка 1
строка 2 //это строка 2

Собственно, в этом и проблема. Первый из этих слэшей закрывает выражение, второй воспринимается как команда.

drBatty писал(а):
28.01.2014 21:54
зачем вам тут регулярки? Используйте

$

grep -v "$line"


Вообще-то, здесь тоже регулярка получается. Тут нужен grep -vF

spool писал(а):
28.01.2014 21:57
мне нужно читать строки из файла $4.txt и удалять их из файла file.cfg. Каким образом я могу с помощью grep -v "$line" или sed "\~$line~" удалить из файла?

grep -vFx "$(cat "$4.txt")" file.cfg > tmp.txt
mv tmp.txt file.cfg

Или, если установлен moreutils:
grep -vFx "$(cat "$4.txt")" file.cfg | sponge file.cfg
Спасибо сказали:

spool
Сообщения: 126
ОС: CentOS 6.6

Re: Ошибка в sed

Сообщение spool » 28.01.2014 22:08

/dev/random писал(а):
28.01.2014 22:04
grep -vFx "$(cat "$4.txt")" file.cfg > tmp.txt
mv tmp.txt file.cfg

А если файл большой? Ведь при использовании > файл может быть сохранен пустым.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.01.2014 22:13

spool писал(а):
28.01.2014 21:57
grep -v "$line" или sed "\~$line~" удалить из файла?

Код: Выделить всё

#!/bin/bash
while read line
do
  TMP=$(mktemp)
  grep -vF "$line" "$2/file.cfg" >$TMP
  mv --backup $TMP "$2/file.cfg"
done < "$2/$4.txt"

как-то так
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Ошибка в sed

Сообщение /dev/random » 28.01.2014 22:14

spool писал(а):
28.01.2014 22:08
А если файл большой?

grep -vFx -f "$4.txt" file.cfg > tmp.txt

spool писал(а):
28.01.2014 22:08
Ведь при использовании > файл может быть сохранен пустым.

grep -vFx -f "$4.txt" file.cfg > tmp.txt && mv tmp.txt file.cfg || rm tmp.txt
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.01.2014 22:15

spool писал(а):
28.01.2014 22:08
А если файл большой? Ведь при использовании > файл может быть сохранен пустым.

sed -i делает точно также.

/dev/random писал(а):
28.01.2014 22:04
Тут нужен grep -vF

да. Я забыл.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

spool
Сообщения: 126
ОС: CentOS 6.6

Re: Ошибка в sed

Сообщение spool » 28.01.2014 22:33

drBatty писал(а):
28.01.2014 22:13
spool писал(а):
28.01.2014 21:57
grep -v "$line" или sed "\~$line~" удалить из файла?

Код: Выделить всё

#!/bin/bash
while read line
do
  TMP=$(mktemp)
  grep -vF "$line" "$2/file.cfg" >$TMP
  mv --backup $TMP "$2/file.cfg"
done < "$2/$4.txt"

как-то так

Этот скрипт все сделал царски. Спасибо.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.01.2014 22:57

spool писал(а):
28.01.2014 22:33
Этот скрипт все сделал царски. Спасибо.

ну на 1 раз можно юзать. Но на второй надо-бы проверку $? (это код ошибки, 0 если всё ОК) сделать после grep и mv.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

spool
Сообщения: 126
ОС: CentOS 6.6

Re: Ошибка в sed

Сообщение spool » 28.01.2014 23:01

drBatty писал(а):
28.01.2014 22:57
ну на 1 раз можно юзать. Но на второй надо-бы проверку $? (это код ошибки, 0 если всё ОК) сделать после grep и mv.

Ну, этот скрипт мне не раз придется использовать. Какого рода проверка?
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.01.2014 23:18

spool писал(а):
28.01.2014 23:01
Какого рода проверка?

после команды grep такие строчки:

Код: Выделить всё

err=$?
if [ $err != 0 ]; then
  echo "в команде grep>$TMP произошла ошибка $err"
  rm --force --verbose $TMP
  exit $err
fi

что-бы потом не удивляться, ппочему скрипт не срабатывает

после mv тоже.

Такие строчки мне не лениво набирать/копипастить, ибо они здорово экономят время, когда ВНЕЗАПНО что-то пойдёт не так. А код ошибки можно посмотреть в мануале.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Ошибка в sed

Сообщение sash-kan » 29.01.2014 18:08

spool писал(а):
28.01.2014 21:57
мне нужно читать строки из файла $4.txt и удалять их из файла file.cfg

про comm в таких случаях часто забывают

$ comm -1 -3 $4.txt file.cfg > temp && mv temp file.cfg


p.s. впрочем, стоит напомнить, что не для всех случаев comm подходит, ибо требует сортированности файлов.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:

kotnaton
Сообщения: 228

Re: Ошибка в sed

Сообщение kotnaton » 28.04.2014 19:59

Кажется, вот еще возможная ошибка:

элементарное, надо вставить в конце строки, содержащей 'v4l2:' текст ':adevice=1,0:amode=1:alsa:forceaudio', получается соответственно:

Код: Выделить всё

sed '/v4l2:/s/$/:adevice=1,0:amode=1:alsa:forceaudio/g' analogtv.m3u


Расчитываю на такое:

Код: Выделить всё

v4l2:///dev/video0:standart=secam:tuner-frequency=151250::adevice=1,0:amode=1:alsa:forceaudio

А получается как-бы такое:

Код: Выделить всё

:adevice=1,0:amode=1:alsa:forceaudioner-frequency=151250


P.S. Экранирование двоеточия косой чертой тоже не помогает
бывает же такое ???
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.04.2014 20:10

kotnaton
что-то вы недоговариваете:

$

$ sed '/v4l2:/s/$/:adevice=1,0:amode=1:alsa:forceaudio/g' v4l2:///dev/video0:standart=secam:tuner-frequency=151250: v4l2:///dev/video0:standart=secam:tuner-frequency=151250::adevice=1,0:amode=1:alsa:forceaudio



kotnaton писал(а):
28.04.2014 19:59
Экранирование двоеточия косой чертой тоже не помогает

не нужно двоеточие экранировать. Это простой символ.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

kotnaton
Сообщения: 228

Re: Ошибка в sed

Сообщение kotnaton » 28.04.2014 20:41

drBatty писал(а):
28.04.2014 20:10
что-то вы недоговариваете:

А чего тут такого ? Просто есть изначальная строка:

Код: Выделить всё

v4l2:///dev/video0:standart=secam:tuner-frequency=85250
которая должна приобрести вид:

Код: Выделить всё

v4l2:///dev/video0:standart=secam:tuner-frequency=85250:adevice=1,0:amode=1:alsa:forceaudio

Маска поиска '/v4l2/s/$/' почему-то, в этом случае, затирает фрагмент строки 'v4l2:///dev/video0:standart=secam:tu'

Вообщем, разобрался, получилось:

Код: Выделить всё

sed -i '/v4l2./s/.$/:adevice=1,0\:amode=1\:alsa\:forceaudio/' analogtv.m3u

(поставил точку перед символом конца строки) хотя так и не понял почему просто $ не срабатывает
бывает же такое ???
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ошибка в sed

Сообщение drBatty » 28.04.2014 20:44

kotnaton писал(а):
28.04.2014 20:41
хотя так и не понял почему просто $ не срабатывает

потому-что УМВР

Shell

$ sed --version sed (GNU sed) 4.2.2

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: