Arhn - архитектура программирования

Как исправить отсутствие предыдущей ошибки регулярного выражения при выполнении команды «sed»?

Я пытаюсь запустить следующее выражение в сценарии, чтобы найти устройство и изменить одно из полей, связанных с устройством, в файле HTML.

sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWSTATUS---$DATE/" -e "s/$PASSORFAIL/$PASSORFAILNEW/" -e "s/$BGCOLOR/$BGCOLORNEW/$POSITION"  -e "s/$OLDNOTE/$NOTE/"  >> //sysadm/shared/file.tmp

Кажется, я продолжаю получать не предыдущее регулярное выражение. Любые идеи?

вывод журнала отладки:

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///

sed: -e expression #5, char 0: no previous regular expression
sed
25.03.2013

  • Вы пытаетесь заменить буквальную последовательность, например. $OLDTEST в вашем исходном файле или являются переменными OLDTEST, TESTING и т. д., которые содержат то, что вы ищете/заменяете? Если первое, используйте одинарные кавычки, чтобы предотвратить расширение, если последнее, нам нужно знать, что содержат эти переменные... 26.03.2013
  • Я пытаюсь найти последовательность, а затем, как только я ее нахожу, я заменяю все связанные с ней элементы 26.03.2013
  • при чтении LINE сделать, если echo $LINE |grep $ROUTER › /dev/null 2›&1 then CURRENTVALU=echo $LINE |awk '{print $53}'| sed 's/ //' echo $LINE | sed -e s/$OLDTEST/$TESTING/ -e s/$CURRENTVALU/$NEWSTATUS---$DATE/ -e s/$PASSORFAIL/$PASSORFAILNEW/ -e s/$BGCOLOR/$BGCOLORNEW/$POSITION -e s/$OLDNOTE/ $ПРИМЕЧАНИЕ/ ›› /sysadmin/shared/file.tmp 26.03.2013
  • elif echo $LINE |grep Devices › /dev/null 2›&1, затем echo $LINE | sed -e s/$CURRENTDEV/$DEV/ -e s/$CURRENTTOTAL/$TOTAL/ -e s/$CURRENTPASS/$PASS/ -e s/$CURRENTFAIL/$FAIL/ -e s/$CURRENTPCNT/$PERCNT/ ›› /sysadmin /shared/file.tmp else echo $LINE ›› /sysadmin/shared/file.tmp fi done ‹ /sysadmin/shared/file.tmp 26.03.2013
  • Это полный цикл while, который я использую, надеюсь, это поможет немного прояснить ситуацию. 26.03.2013

Ответы:


1

Ваш журнал отладки рассказывает вам всю историю ;-)

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///
 #------^-- empty regular expression

Отсюда и сообщение об ошибке "no previous regular expression".

Непонятно о вашем опыте, поэтому есть 2 решения. Напомним, что в оболочках на основе unix/linux строки внутри dbl-кавычек будут оцениваться на предмет замены переменных, и что ваш код "s/$OLDTEST/$TESTING/" выглядит как строка, требующая замены переменных.

Вам может понадобиться сделать

export OLDTEST="something old"
export TESTING="something new"

чтобы этот код работал.

Если вы действительно хотите, чтобы литеральная строка '$OLDTEST' была заменена литеральной строкой '$TESTING', вам нужно скрыть переменные от обработки оболочки. Мы делаем это в unix/linux, используя одинарные кавычки, поэтому ваши команды будут

sed 's/$OLDTEST/$TESTING/
     s/$CURRENTVALU/$NEWSTATUS---$DATE/
     s/$PASSORFAIL/$PASSORFAILNEW/
     s/$BGCOLOR/$BGCOLORNEW/$POSITION
     s/$OLDNOTE/$NOTE/'  >> //sysadm/shared/file.tmp

Но... я не вижу здесь входного файла.

так что это действительно

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile >> //sysadm/shared/file.tmp

И вы, вероятно, действительно не хотите добавлять к существующему файлу что-то с расширением tmp, поэтому...

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile > //sysadm/shared/file.tmp
#-----------------------------------------------only one > -^-------

Использование >> означает, что ваше тестирование улучшает ваш сценарий sed, вы добавляете результаты каждого запуска в один и тот же файл. Вы получите много дублирующейся информации.

Я использовал сокращение sed, опуская параметр -e. Sed может обрабатывать целую группу команд как один аргумент, как показано здесь. Вы также можете поместить все эти команды в отдельный файл, а затем вызвать его как

   sed -f fixer.sed inputFile > //sysadmin/shared/file.tmp

И, наконец, если ваш sed поддерживает опцию -i, вы можете «встроить» свои изменения и просто

sed -i -f fixer.sed inputFile

И sed перезапишет старый файл с изменениями. Я бы рекомендовал не делать этого, пока вы не будете уверены, что все меняет вашу работу и не вызывает непредвиденных последствий. Как только ваш исходный файл исчезнет, ​​его уже не вернуть, поэтому сохранение в .tmp, как вы делаете, — это хороший ремень безопасности :-)

IHTH

25.03.2013
  • Я делаю эхо $LINE | sed, поэтому я ввожу $LINE. Спасибо за вклад, мне нужно обработать это. 26.03.2013
  • Даже с вашим расширенным примером кода я не вижу, где вы устанавливаете значение для OLDTEST и т. д. Вам может понадобиться или не понадобиться export, но вам определенно нужен либо OLDTEST="xyz", либо что-то в вашем цикле while, например echo "$LINE" | while read OLDTEST var2 .... rest ; делать .... ; сделано` . Нам было бы намного проще ответить, если бы весь ваш код был в основном вопросе. Подумайте о редактировании. Используйте инструмент редактирования {} в левом верхнем углу поля редактирования, чтобы отформатировать код. Удачи. 26.03.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..