簡體   English   中英

Grep / Sed / Awk選項

[英]Grep/Sed/Awk Options

您如何grep或使用sed或awk解析動態長度子字符串? 這里有些例子:

我需要解析這些字符串中除“ XXXXX.WAV”以外的所有內容,但是這些字符串不是設置的長度。

有時是這樣的:

{"filename": "/assets/JFM/imaging/19001.WAV"},
{"filename": "/assets/JFM/imaging/19307.WAV"},
{"filename": "/assets/JFM/imaging/19002.WAV"}

有時像這樣:

 {"filename": "/assets/JFM/LN_405999/101.WAV"},
 {"filename": "/assets/JFM/LN_405999/102.WAV"},
 {"filename": "/assets/JFM/LN_405999/103.WAV"}

是否有一種偉大的動態方法可以僅解析.WAV? 也許如果我從“ /”開始並解析到“?”

編輯:

預期的輸出是這樣的:

19001.WAV
19307.WAV
19002.WAV

要么:

101.WAV
101.WAV
103.WAV

只需按照注釋中的建議使用grep

grep -o '[^/]\{1,\}\.WAV' yourfile

如果wav文件始終包含數字,則這似乎更明確(結果相同):

grep -o '[0-9]\{1,\}\.WAV'

假設文件的開頭和結尾都有[]行,則看起來您的輸入是JSON,在這種情況下,我建議您安裝並使用jq而不是基於文本的實用程序,並執行以下操作:

jq -r '.[]|.filename|split("/")[-1]' 

否則,列出的任何工具都可以正常工作。

grep -o '[^/]*\.WAV'

要么

sed -ne 's,.*/\([^/]*\.WAV\).*$,\1,p' 

要么

awk -F'"' '/WAV/ {split($4,a,"/"); print a[length(a)]}'

在每種情況下,還有多種其他可能的解決方案。

嘗試這個 -

awk  -F'[{":}/]' '{print $(NF-2)}' f
19001.WAV
19307.WAV
19002.WAV

要么

egrep -o '[[:digit:]]{5}.WAV' f
19001.WAV
19307.WAV
19002.WAV

要么

egrep -o '[[:digit:]]{5}.[[:alpha:]]{3}' f
19001.WAV
19307.WAV
19002.WAV

您可以根據需要在egrep中使用不同的示例輕松更改數字和字符的值,但是awk在兩種情況下都可以正常工作。

或與sed

$ sed 's,.*/,,; s,".*,,' x
101.WAV
102.WAV
103.WAV

說明:

  • s,.*/,, --刪除所有內容,包括最右邊的/
  • s,".*,, -刪除從最左邊的"到行尾的所有內容

您列出的所有程序都使用regex解析名稱,因此我將向您展示一個使用grep的示例,它可能是這種情況下最基本的示例。

有兩個選項,具體取決於您在“ .wav”之前定義XXX部分的確切方式。

如您所指出的,選項1只是文件名,即最后一個斜杠之后的所有內容:

grep -hoi "[^/]\+\.WAV"

讀作為“除斜杠之外的任何字符”( [^/] )至少重復一次( \\+ ),然后是文字.WAV\\.WAV )。

選項2是僅獲取擴展名之前的數字:

grep -hoi "[[:digit:]]\+\.WAV"

要么

grep -hoi "[0-9]\+\.WAV"

這些讀作“數字”( [[:digit:]][0-9]表示同一件事)至少重復一次( \\+ ),然后是文字.WAV\\.WAV )。

在所有情況下,我建議使用標志-h-o-i ,它們已串聯到單個選項-hoi -h從輸出中禁止文件名。 -o使grep僅輸出匹配的部分。 -i使區分大​​小寫不敏感,因此擴展名應該改為.wav而不是.WAV ,這樣就可以了。

同樣,在所有情況下,輸入取決於您。 您可以通過另一個程序將其插入

program | grep -hoi "[^/]\+\.WAV"

您可以使用stdin重定向從文件中獲取它:

grep -hoi "[^/]\+\.WAV" < somefile.txt

或者,您可以將文件名傳遞給grep

grep -hoi "[^/]\+\.WAV" somefile.txt

另一個awk

awk -F'[/"]' '{print $(NF-1)}' file

19001.WAV
19307.WAV
19002.WAV
awk -F/ '{print substr($5,1,7)}' file

101.WAV
102.WAV
103.WAV

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM