На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
spool
Сообщения: 126
ОС: CentOS 6.6
Сообщение
spool » 28.01.2014 21:41
Приветствую. Имеется конструкция вида
При выполнении получаю ошибку
Код: Выделить всё
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
Администратор
Сообщения: 5471
ОС: Gentoo
Сообщение
/dev/random » 28.01.2014 21:52
В $line, случайно, символов / нет?
spool
Сообщения: 126
ОС: CentOS 6.6
Сообщение
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
Сообщение
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: неизвестная команда: `/'
зачем вам тут регулярки? Используйте
PS: на край можете так:
это спасёт от слешей, но всё остальное останется...
spool
Сообщения: 126
ОС: CentOS 6.6
Сообщение
spool » 28.01.2014 21:57
drBatty, мне нужно читать строки из файла $4.txt и удалять их из файла file.cfg. Каким образом я могу с помощью grep -v "$line" или sed "\~$line~" удалить из файла?
/dev/random
Администратор
Сообщения: 5471
ОС: Gentoo
Сообщение
/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 -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
Сообщение
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
Сообщение
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"
как-то так
/dev/random
Администратор
Сообщения: 5471
ОС: Gentoo
Сообщение
/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
Сообщение
drBatty » 28.01.2014 22:15
spool писал(а): ↑ 28.01.2014 22:08
А если файл большой? Ведь при использовании > файл может быть сохранен пустым.
sed -i делает точно также.
да. Я забыл.
spool
Сообщения: 126
ОС: CentOS 6.6
Сообщение
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
Сообщение
drBatty » 28.01.2014 22:57
spool писал(а): ↑ 28.01.2014 22:33
Этот скрипт все сделал царски. Спасибо.
ну на 1 раз можно юзать. Но на второй надо-бы проверку $? (это код ошибки, 0 если всё ОК) сделать после grep и mv.
spool
Сообщения: 126
ОС: CentOS 6.6
Сообщение
spool » 28.01.2014 23:01
drBatty писал(а): ↑ 28.01.2014 22:57
ну на 1 раз можно юзать. Но на второй надо-бы проверку $? (это код ошибки, 0 если всё ОК) сделать после grep и mv.
Ну, этот скрипт мне не раз придется использовать. Какого рода проверка?
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
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 тоже.
Такие строчки мне не лениво набирать/копипастить, ибо они здорово экономят время, когда ВНЕЗАПНО что-то пойдёт не так. А код ошибки можно посмотреть в мануале.
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
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 подходит, ибо требует сортированности файлов.
kotnaton
Сообщения: 234
Сообщение
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
Сообщение
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
Экранирование двоеточия косой чертой тоже не помогает
не нужно двоеточие экранировать. Это простой символ.
kotnaton
Сообщения: 234
Сообщение
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
Сообщение
drBatty » 28.04.2014 20:44
kotnaton писал(а): ↑ 28.04.2014 20:41
хотя так и не понял почему просто $ не срабатывает
потому-что УМВР
Shell
$ sed --version
sed (GNU sed) 4.2.2