GNU/Linux >> Belajar Linux >  >> Ubuntu

Bash:Ekspresi Reguler Dalam Substitusi?

Saya memiliki skrip bash untuk mengganti nilai angka di dalam pola teks. Misalkan saya memiliki file seperti ini:

word5word
word55word

Dan saya ingin terlihat seperti ini:

word125word
word125word

Saya memiliki skrip ini untuk melakukan itu:

#!/bin/bash

re='([0-9]|[0-9][0-9])'
while read line
  do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
  done < /home/tomak/test.txt

Untuk beberapa alasan, ekspresi 're' tidak ditafsirkan dengan benar dan itu mencetak baris aslinya. Saya tidak tahu mengapa. Ini berfungsi untuk satu digit, yaitu re='[0-9]' .

Untuk merumuskan ekspresi, saya menggunakan informasi dari Bash Guide for Beginners yang menyatakan bahwa:

Dua ekspresi reguler dapat digabungkan dengan operator infiks “|”;
ekspresi reguler yang dihasilkan cocok dengan semua string yang cocok dengan subekspresi
.

Tapi itu tidak bekerja untuk saya. Apa yang saya lewatkan?

Perhatikan bahwa saya mencoba mengatur shopt -s extglob dan rumuskan ekspresi seperti [0-9][0-9]? tapi itu juga tidak berhasil.

Saya menggunakan Ubuntu 14.10 dan memiliki stock bash versi 4.3.30. Saya menjalankan skrip dengan bash foo.sh .

Jawaban yang Diterima:

Substitusi ekspansi parameter tidak berfungsi dengan ekspresi reguler. extglob dapat membantu Anda di sini, tetapi juga tidak berfungsi dengan ekspresi reguler.

Sintaks yang benar untuk ekspresi di bawah extglob adalah

re='+([0-9])'

yaitu satu digit satu kali atau lebih.

Tes:

re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
done

Keluaran:

word125word
word125word

Ubuntu
  1. Apa itu Pemisah Kata Readline?

  2. Mengapa `\d` tidak berfungsi dalam ekspresi reguler di sed?

  3. Linux GUI Regular Expression File Renamer (dengan substitusi)

  1. Ekspresi Reguler untuk menemukan karakter ganda di Bash

  2. Masalah ekspresi reguler di Bash:[^negate] sepertinya tidak berfungsi

  3. Ekspresi reguler dengan sed

  1. Memperkenalkan ekspresi reguler

  2. Ekspresi reguler:Menarik semuanya bersama-sama

  3. rentang nomor ekstrak grep