繁体   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