Saya ingin mengambil string yang muncul setelah WORK= dan mengabaikan jika ada tanda kurung setelah string itu.

Teksnya terlihat seperti ini:

//INALL TYPE=GH,WORK=HU.ET.ET(IO)
//INA2 WORK=HU.TY.TY(OP),TYPE=KK
//OOPE2 TYPE=KO,WORK=TEXT.LO1.LO2,TEXT
//OOP2 TYPE=KO,WORK=TEST1.TEST2
//H1 WORK=OP.TEE.GHU,TYPE=IU

Jadi, output yang diinginkan harus dicetak hanya:

TEXT.L01.L02
TEST1.TEST2
OP.TEE.GHU

Sejauh ini, saya hanya bisa mencocokkan dan memotong sebelum WORK= tetapi tidak dapat menghapus WORK= itu sendiri:

sed -E 's/(.*)(WORK=.*)/\2/'

Saya tidak yakin bagaimana untuk melanjutkan. Apakah ada yang bisa membantu ?

2
Sunny 29 Desember 2020, 00:16

3 jawaban

Jawaban Terbaik

Kamu bisa memakai

sed -n '/WORK=.*([^()]*)/!s/.*WORK=\([^,]*\).*/\1/p' file > newfile

Detail:

  • -n - menekan output baris default
  • /WORK=.*([^()]*)/! - jika sebuah baris berisi WORK= diikuti dengan teks apa pun dan kemudian substring (...) melewatinya
  • s/.*WORK=\([^,]*\).*/\1/p - else, mengambil baris dan menghapus semua hingga dan termasuk WORK=, dan kemudian menangkap ke dalam Grup 1 setiap nol atau lebih karakter selain koma, dan kemudian menghapus sisa baris; p mencetak hasilnya.

Lihat demo sed:

s='//INALL TYPE=GH,WORK=HU.ET.ET(IO)
//INA2 WORK=HU.TY.TY(OP),TYPE=KK
//OOPE2 TYPE=KO,WORK=TEXT.LO1.LO2,TEXT
//OOP2 TYPE=KO,WORK=TEST1.TEST2
//H1 WORK=OP.TEE.GHU,TYPE=IU'
sed -n '/WORK=.*([^()]*)/!s/.*WORK=\([^,]*\).*/\1/p' <<< "$s"

Keluaran:

TEXT.LO1.LO2
TEST1.TEST2
OP.TEE.GHU
2
Wiktor Stribiżew 29 Desember 2020, 13:03

Bisakah Anda mencoba mengikuti awk, ditulis dan diuji dengan contoh yang ditampilkan di GNU awk.

awk '
match($0,/WORK=[^,]*/){
  val=substr($0,RSTART+5,RLENGTH-5)
  if(val!~/\([a-zA-Z]+\)/){ print val }
}
' Input_file

Penjelasan: Menambahkan penjelasan rinci di atas.

awk '                                    ##Starting awk program from here.
match($0,/WORK=[^,]*/){                  ##Using match function to match WORK= till comma comes.
  val=substr($0,RSTART+5,RLENGTH-5)      ##Creating val with sub string of match regex here.
  if(val!~/\([a-zA-Z]+\)/){ print val }  ##checking if val does not has ( alphabets ) then print val here.
}
' Input_file                             ##Mentioning Input_file name here.
0
RavinderSingh13 29 Desember 2020, 01:58

Ini mungkin berhasil untuk Anda (GNU sed):

sed -n '/.*WORK=\([^,]\+\).*/{s//\1/;/(.*)/!p}' file

Ekstrak string berikut WORK= dan jika string tersebut tidak mengandung (...) cetak.

Ini akan berfungsi jika hanya ada nol atau satu kemunculan WORK= dan bahwa pengecualian hanya bergantung pada (...) yang terjadi di dalam string tersebut dan bukan bidang berikut lainnya.

Untuk solusi global dengan ketentuan yang sama untuk parens:

sed -n '/WORK=\([^,]\+\)/{s//\n\1\n/;s/[^\n]*\n//;/(.*).*\n/!P;D}' file

N.B. Ini mencetak setiap string tersebut pada baris terpisah dan tidak termasuk string kosong.

0
potong 29 Desember 2020, 12:02