Nano Hash - криптовалюты, майнинг, программирование

sed в сценарии AIX не работает со специальными символами

Я создал скрипт, который генерирует HTML-код. В конце сценария мне нужно выделить некоторые слова в таблице, сделав их жирными.

Поэтому мне нужно заменить в коде каждый экземпляр WORD на WORD или WORD

конечно, WORD хранится в переменной $CODE, чтобы сделать это намного сложнее.

Я пытался использовать команду sed, к сожалению, безуспешно.

 sed -e 's/$CODE/<b>$CODE</b>/g' page.html > newpage.html

Я пробовал также с двойными кавычками, с экранирующими символами перед /, многими комбинациями кавычек и двойных кавычек, с | как разделитель, всегда безуспешно. Если бы кто-нибудь из вас мог указать мне на решение, я был бы очень благодарен.

PS: Пробовал также с awk... но с переменной это настоящая головная боль...

EDIT: Вот мой точный код, чтобы помочь всем вам. code_list.txt содержит список строк описания CODE.

 for y in code_list.txt
 do
      CODE=$(echo $y | cut -f1 -d-)
      awk -v code="$CODE" '{if(match($0,code)){gsub(code,"<b>"code"</b>")}} 1' $SCRIPTS/html/daily_running_jobs.html > $SCRIPTS/html/daily_running_jobs_highlight.html
      mv $SCRIPTS/html/daily_running_jobs_highlight.html $SCRIPTS/html/daily_running_jobs.html  
 done

04.06.2016

  • небольшая точность, если я повторяю команду, переменные хорошо переводятся. Но команда не выполнена. 04.06.2016
  • отредактируйте свой вопрос, включив в него краткие, проверяемые образцы входных данных и ожидаемые результаты. Включите те варианты использования, с которыми, по вашему мнению, будет сложно справиться, и если ваши СЛОВА могут включать любые неалфавитные символы, опишите и покажите и эти случаи. Также включите такие случаи, как «the» и «There», чтобы мы могли увидеть, как обрабатывать частичное и чувствительное к регистру соответствие. Наконец, не используйте заглавные буквы для имен неэкспортируемых переменных, чтобы избежать конфликтов с именами встроенных и других экспортируемых переменных. 04.06.2016

Ответы:


1

Нет причин, по которым ваша идея не сработала бы, если бы

  • вы используете "вместо"

  • в выражении $CODE нет @ (EDIT: и нет разрыва строки) (замените / на @)

sed -e "s@$CODE@<b>$CODE</b>@g" page.html > newpage.html

Проблема с вашим решением заключалась в цитировании и в том, что разделитель регулярных выражений sed / также использовался в вашем замещающем выражении, как в </b>

EDIT — несколько значений из файла нужно заменить

Если у вас есть файл code_list.txt, в котором все строки, подлежащие замене, указаны по одной на строку, выполните

cp page.html  newpage.html
while read var
do
    mv newpage.html newpage1.html
    sed -e "s@$var@<b>$var</b>@g" newpage1.html > newpage.html
    # optionally rm newpage1.html
done < code_list.txt
04.06.2016
  • Я попробую еще раз, но я думаю, что уже пробовал это с | вместо @. Подробнее расскажу завтра. 05.06.2016
  • Прости, Стефан, но это не работает. У меня есть это сообщение об ошибке. Переменная CODE заменена на NTCA :sed: Функция s@NTCA не может быть проанализирована. 06.06.2016
  • Из вашего комментария к ответу Чета я предполагаю, что ваша переменная CODE содержит не NTCA, а NTCA EBXL FSRV и, возможно, даже символ NEWLINE где-то там - не могли бы вы проверить, предназначено ли это или должен ли код работать, если только NTBA с ничего после значения $CODE - пожалуйста, сообщите вывод echo ">>$CODE<<". В случае, если вам нужно заменить строку новой строкой, нам, возможно, придется подумать о чем-то совершенно другом.... 06.06.2016
  • Моя команда замены находится в ‹‹ для CODE в цикле code_list.txt ››, где code_list.txt содержит один код в строке. Поэтому я предполагаю, что он должен использовать код первой строки, затем выполнить команду awk sed, затем второй код и т. д. 06.06.2016
  • почему вы это предполагаете? Я думаю, что это не произойдет само по себе, вам нужно закодировать цикл - см. Мое редактирование - было бы проще, если бы вы указали это в исходном вопросе. 06.06.2016
  • Извините, нужно было прочитать ваш комментарий полностью, прежде чем продолжить, но for CODE in code_list.txt обработает только значение code_list.txt 06.06.2016
  • Извините еще раз, Стефан, но он все еще не работает. Я повторил команду проверить, и вар хорошо заменяется кодами, но команда sed не выполняется. Мне пришлось удалить -i, так как он не поддерживается в моей системе. Я использовал output.html, чтобы записать вывод sed в другой файл. Без большего успеха. 06.06.2016
  • хорошо, если -i не работает, у нас есть проблема, потому что каждый запуск будет перезаписывать предыдущий выходной файл, и вы получите только последнюю замену, присутствующую в output.html - я снова отредактирую 06.06.2016
  • Спасибо, Стефан, как я мог пропустить, что всегда обновляю один и тот же файл. Добавил подкачку файлов, но к сожалению, команда sed все равно не выполняется :-( 06.06.2016
  • Мой плохой Стефан. Это работает как шарм! Я искал не тот html-файл :-) Большое спасибо за вашу поддержку. 06.06.2016

  • 2
    awk -vcode="$CODE" '{if(match($0,code)){gsub(code,"<b>"code"</b>")}} 1' page.html > newpage.html
    

    предположим, что есть переменная $CODE

    Передаем в переменную awk, если есть совпадение то заменяем

    04.06.2016
  • Спасибо, Чет. Я попробую это в понедельник @work. 04.06.2016
  • awk не C: 'match($0,code){gsub(code,"<b>"code"</b>")} 1', но это не сработает при различных значениях code, как и эквивалентный сценарий sed, так что не знаю, правильный ли это ответ. Кроме того, не помещая пробел между -v и code, вы делаете сценарий излишне специфичным для gawk, просто поставьте пробел, чтобы он был переносимым: -v code=... 04.06.2016
  • Привет, я только что попробовал вариант awk, но он не работает лучше: #выделите важные коды приложений для y в $(cat $SCRIPTS/$APP) do CODE=$(echo $y | cut -f1 -d-) awk -v code=$CODE '{if(match($0,code)){gsub(code,‹b›code‹/b›)}} 1' $SCRIPTS/html/daily_running_jobs.html › $SCRIPTS/html/daily_running_jobs_highlight .html готово 06.06.2016
  • Это дает мне эту ошибку: + awk -v code=NTCA EBXL FSRV {if(match($0,code)){gsub(code,‹b›code‹/b›)}} 1 /home/ppcm980x/ctm_em/etc /emweb/tomcat/webapps/commvault/scripts/html/daily\ _running_jobs.html + 1› /home/ppcm980x/ctm_em/etc/emweb/tomcat/webapps/commvault/scripts/html/daily_running_jobs_highlight.html awk: строка NTCA не может содержать символ новой строки. Исходная строка — 1. Контекст ошибки — ››› ‹‹‹ awk: Строка NTCAEBXL не может содержать символ новой строки. Исходная строка 1. awk: String NTCAEBXLEG не может содержать символ новой строки. Исходная строка 1. 06.06.2016
  • Я должен уточнить, что если я жестко запрограммирую значение в -v code=TEST, то оно работает. Но использование переменной здесь не работает. 06.06.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..