Создание шаблона регулярного выражения для grep

Поэтому у меня есть строка, подобная LST = fr, de, pl, ru, ch, us, uk, ca Здесь я должен создать шаблон регулярных выражений для будущей операции grep, поэтому для этого мне нужно изменить мою строку, чтобы она соответствовала этой fr\|de\|pl\|ru\|ch\|us\|uk\|ca

 set LST = `grep "^LST *=" /remote/file/config.ini | sed 's/LST *= *//' | sed 's/ *//g' | tr , "\|"` 

К сожалению, tr , "\\|" не заменяет заданные символы для создания моего шаблона регулярного выражения … результатом является frdeplruchusukca . Как создать шаблон регулярных выражений или как я могу (например) найти наличие de и установить найденное значение для моей переменной LST?

Образец config.ini

 ; sample of ini file [SITE_PREF] LST = fr, de, pl, ru, ch, us, uk, ca TASKLIST = T1,TT3,TT0 

5 Solutions collect form web for “Создание шаблона регулярного выражения для grep”

Итак, во-первых, tr работает по одному символу за раз, он не может заменить a , с \| (от одного до двух символов). Поэтому вместо этого используйте sed : sed -e 's/,/\\|/'

Два, вы можете комбинировать grep и sed s, это, похоже, работает на Bash, с GNU sed:

 $ LST=$(sed -n '/^LST *=/ {s/^LST *= *//; s/, */\\|/g; p}' config.ini) $ echo "$LST" fr\|de\|pl\|ru\|ch\|us\|uk\|ca 

(В основном это говорит: во всех строках, соответствующих /^LST *=/ , делайте вещи в фигурных скобках: две s ubstitutions и p rint строку.)

Три, с вашим tr , вы должны получить запятые, измененные на обратную косую черту или трубы, в зависимости от того, работает ли цитата или нет, т.е.

 $ echo "fr,de,pl" | tr , "\|" fr|de|pl $ echo "fr,de,pl" | tr , '\\|' fr\de\pl 

Но ты этого не сделал, вместо этого ничего не получилось. Я не могу воспроизвести это с помощью Bash, но этот синтаксис выглядит как csh , и я получаю какое-то странное поведение с tcsh . В некоторых случаях. Не все.

ОК:

 $ tcsh > echo "fr,de,pl" | sed 's/,/\\|/' fr\|de,pl > set LST = `echo "fr,de,pl" | sed 's/,/\\|/'` > printf "%s\n" "$LST" fr\|de,pl 

Не так хорошо:

 $ tcsh > echo "fr,de,pl" | sed 's/, */\\|/' fr\|de,pl > set LST = `echo "fr,de,pl" | sed 's/, */\\|/'` > printf "%s\n" "$LST" fr|de,pl 

Единственное различие, которое я вижу, – это звездочка во втором случае.

С awk :

 ... | awk -F'= ' '{gsub(", ", "\\|", $2); print $2}' 
  • -F '= ' устанавливает разделитель полей как =

  • gsub(", ", "\\|", $2) заменяют все , с \| во втором поле на месте

  • print $2 печатает второе поле

Пример:

 $ awk -F'= ' '{gsub(", ", "\\|", $2); print $2}' <<<'LST = fr, de, pl, ru, ch, us, uk, ca' fr\|de\|pl\|ru\|ch\|us\|uk\|ca 

fr\|de\|pl\|ru\|ch\|us\|uk\|ca не является стандартным / переносным как регулярное выражение для grep, однако:

 fr de pl ru ch us uk ca 

То есть с элементами, разделенными на новую строку, является стандартным и может также использоваться с grep -F для фиксированного поиска строк (поэтому у вас нет проблем, если ваши поисковые термины содержат операторы regexp).

Итак, вы можете сделать (здесь, используя синтаксис оболочки POSIX, вы не хотите использовать csh для скриптинга):

 search_term=$( sed ' /^LST *= */!d s/// s/ *, */\ /g' config.ini ) grep -F -- "$search_term" some-file 

Если ваша реализация grep поддерживает его, вы также можете передать параметр -w для поиска только целых слов.

LST=$(grep "^LST *=" /remote/file/config.ini| sed -e 's/LST *= *//' -e 's/, */\\|/g')

 perl -p0E '($_)= /LST = (.*)/; s/, /\\|/g' config.ini 
  • grep first n и последние n символов из строки в файле
  • Как именно создать сценарий sed и использовать его для редактирования файла?
  • Любой способ, с помощью которого я могу преобразовать любую заданную временную метку в стандартную в BASH
  • Раскрашивание вывода conky-cli в dwm
  • Извлечь строки из текстового файла на основе параметра в одну строку
  • Переименование нескольких файлов, удаление всего одного экземпляра шаблона
  • Как выполнить команду оболочки, созданную с использованием echo и sed?
  • grep-блок строк
  • анализировать HTML в Bash (когда grep просто недостаточно)
  • Используйте AWK для разделения подстроки на последние n символов на новый столбец
  • Вставка текста из встроенного файла после сопоставления шаблона в другом файле
  • Interesting Posts

    Открывается ли консоль после загрузки?

    ошибка установки драйвера Linux – "/lib/modules/2.6.18-194.el5/build: Нет такого файла или каталога. Стоп."

    Если ssh-add будет тихим, если ключ уже есть

    как предотвратить расширение псевдонимов `eval` до произвольного псевдонима и сохранить бесконечную защиту цикла от функции?

    grep трубопроводы в sed, заменяя inline; но я хочу, чтобы sed печатал имя файла и менял строку. Является ли это возможным?

    btrfs: как вычислить экономию пространства при сжатии btrfs?

    строка 4: 5 +: синтаксическая ошибка: ожидается операнд (токен ошибки «+»)

    Яркость экрана в Debian после сна / спящего режима на Macbook с графической картой Intel

    Выполнение скриптов оболочки bash

    Как копировать «только файлы» рекурсивно

    Вход в систему или подключение к USB-устройству пробуждает сетевой принтер

    После использования команды bg можно перенаправить вывод, например nohup?

    Преобразовать .csv в 3 столбца и строку

    «Не может найти crtc для вывода VGA-0» из xrandr

    Контент Yum конфликтует из-за моей ошибки. Как мне исправить?

    Linux и Unix - лучшая ОС в мире.