Извлечь подстроку, используя регулярное выражение в файле Unix

У меня есть файл с содержимым ниже.

/ABC/RTE/AD_900_VOP_123/OPP /ABC/RTE/TRE/AD_900_VOP_145/BBB /ABC/RTE/AN_900_VFP_124/FBF /ABC/RTE/HD_900_FOP_153/WEW /ABD/RDV/AD_900_VOP_123/OPP /ABC/RTE/WD_900_VOP_123/GRR/TRD /ABC/RTE/RTD/AR_900_VOP_443/SDD 

Как я могу использовать регулярное выражение в этом файле, чтобы получить результат, такой как

 AD_900_VOP_123 AD_900_VOP_145 AN_900_VFP_124 HD_900_FOP_153 AD_900_VOP_123 WD_900_VOP_123 AR_900_VOP_443 

6 Solutions collect form web for “Извлечь подстроку, используя регулярное выражение в файле Unix”

Gnu grep

 grep -oE '[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+' 

Используйте флагов perl-regex и утверждения look-behind и look-ahead, чтобы гарантировать, что совпадение окружено /

 grep -oP '(?<=/)[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+(?=/)' 

Один из способов с awk :

 awk -F/ '{for(i=1;i<=NF;i++)$0=($i~/_/)?$i:$0}1' file 

IMHO Perl предлагает самое простое и гибкое решение:

 perl -nE 'say $1 if m{/(\w+\d+\w+\d+)/};' input_file 

Обратите внимание, что input_file является обязательным: STDIN будет отфильтровываться, если / если имя входного файла не указано.

Это должно делать то, что вам нужно.

Содержимое tstfile.txt :

 /ABC/RTE/AD_900_VOP_123/OPP /ABC/RTE/TRE/AD_900_VOP_145/BBB /ABC/RTE/AN_900_VFP_124/FBF /ABC/RTE/HD_900_FOP_153/WEW /ABD/RDV/AD_900_VOP_123/OPP /ABC/RTE/WD_900_VOP_123/GRR/TRD /ABC/RTE/RTD/AR_900_VOP_443/SDD 

Команда для преобразования tstfile.txt :

 $ sed 's|.*/\([0-9_A-Z]\+900[0-9_A-Z]\+\)/.*|\1|' tstfile.txt AD_900_VOP_123 AD_900_VOP_145 AN_900_VFP_124 HD_900_FOP_153 AD_900_VOP_123 WD_900_VOP_123 AR_900_VOP_443 

объяснение

Вышеприведенное раскрывает все, что касается «900», до первого косая черта, встречающегося в начале «900» (слева от 9), и все до первой косой черты в конце «900» (справа от последний 0).

 sed 's|.*/\([^/]*_[^/]*\)/.*|\1| ' <<\INPUT /ABC/RTE/AD_900_VOP_123/OPP /ABC/RTE/TRE/AD_900_VOP_145/BBB /ABC/RTE/AN_900_VFP_124/FBF /ABC/RTE/HD_900_FOP_153/WEW /ABD/RDV/AD_900_VOP_123/OPP /ABC/RTE/WD_900_VOP_123/GRR/TRD /ABC/RTE/RTD/AR_900_VOP_443/SDD INPUT 

Это приведет к удалению со второго до последнего вхождения / непосредственно перед символом _ в строке, сохранит все между ними и следующее вхождение / , а затем удалит остальные.

Вышеуказанная команда печатает ….

 AD_900_VOP_123 AD_900_VOP_145 AN_900_VFP_124 HD_900_FOP_153 AD_900_VOP_123 WD_900_VOP_123 AR_900_VOP_443 

Части, которые вы не хотите, имеют косую черту и три символа.

Часть, которую вы хотите сохранить, также начинается с косой черты и имеет более трех символов, но третий символ является подчеркиванием, поэтому мы удаляем все части, которые выглядят как /XXX но не /XX_

Это оставляет ведущую косую черту, которую мы хотим сохранить, поэтому мы, наконец, также удалим эту косую черту.

sed 's|/..[^_]||g; s|^/||' </tmp/f1

Объяснение:

Команда sed состоит из двух s (заменяющих команд), разделенных ; , Поскольку у нас есть слэш в регулярном выражении, я использую s|...|...| вместо регулярных s/.../.../

Обе подстановочные команды имеют вторую часть пустую – заменить ничего = удалить эту часть. Первый использует g для глобальных, другими словами, делайте это снова и снова, пока нечего заменить.

[^_] Соответствует чему-либо, кроме подчеркивания. T

  • AWK для замены строки начинается с большого файла
  • Как я могу использовать sed для определения определенного количества чисел, прежде чем он вставляет символ? ### - ### - ####
  • Получить содержимое файла из первого экземпляра в последний экземпляр некоторой произвольной строки
  • Выполните вывод parse ls с помощью sed, чтобы получить расположение файлов файлов с определенными именами
  • Как использовать awk или sed для преобразования csv в более читаемый формат
  • sed удаляет последнее пространство только в конце строки, в сочетании с awk
  • использование sed / awk в переменных сценария bash
  • Возвращает количество совпадений с помощью find / replace с помощью sed
  • Обработка переменной bash с помощью sed
  • Как grep / awk / sed для текста в журнале и отображать кусок с текстом?
  • Я хочу использовать «sed» для вставки новых строк (одна строка превращается в сотни)
  • Linux и Unix - лучшая ОС в мире.