GNU/Linux >> Belajar Linux >  >> Linux

Cara menggunakan sed untuk mengekstrak substring

sed 's/[^"]*"\([^"]*\).*/\1/'

melakukan pekerjaan.

penjelasan bagian dalam ' '

  • s - memberitahu sed untuk menggantikan
  • / - awal dari string regex yang akan dicari
  • [^"]* - karakter apa pun yang bukan ", beberapa kali. (cocok dengan nama parameter= )
  • " - hanya " .
  • ([^"]*) - apa pun di dalam () akan disimpan sebagai referensi untuk digunakan nanti. \ ada sehingga tanda kurung tidak dianggap sebagai karakter untuk dicari. [^"]* artinya sama seperti di atas. (cocok dengan RemoteHost misalnya)
  • .* - karakter apa pun, berapa pun jumlahnya. (cocok dengan " access="readWrite"> /parameter )
  • / - akhir regex pencarian, dan awal string pengganti.
  • \1 - referensi ke string yang kami temukan dalam tanda kurung di atas.
  • / akhir string pengganti.

pada dasarnya s/telusuri ini/ganti dengan ini/ tetapi kami memintanya untuk mengganti seluruh baris hanya dengan sebagian yang kami temukan sebelumnya.


grep lahir untuk mengekstrak sesuatu:

grep -Po 'name="\K[^"]*'

uji dengan data Anda:

kent$  echo '<parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
  <parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
  <parameter name="RemoteHost" access="readWrite"></parameter>
  <parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="PortMappingProtocol" access="readWrite"></parameter>
  <parameter name="InternalClient" access="readWrite"></parameter>
  <parameter name="PortMappingDescription" access="readWrite"></parameter>
'|grep -Po 'name="\K[^"]*'
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Anda ingin awk .

Ini akan menjadi peretasan yang cepat dan kotor:

awk -F "\"" '{print $2}' /tmp/file.txt

PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Linux
  1. Cara menggunakan BusyBox di Linux

  2. Cara menggunakan perintah sed Linux

  3. Cara Menggunakan Perintah Sed di Linux dengan Contoh

  1. Cara menggunakan Perintah Su di Linux

  2. Ekstrak Substring Menurut Regexp Dengan Sed Atau Grep?

  3. Cara menggunakan sed untuk menghapus n baris terakhir dari sebuah file

  1. Bagaimana saya menggunakan cron di Linux

  2. Cara Menggunakan Nginx untuk Mengarahkan

  3. Bagaimana cara menggunakan perintah 'tar' untuk mengekstrak paket file .xz di Linux?