2

我有一个rpm文件,例如abc_defg_hijd-3.29.0-2_el6_11h.txt.

我需要解析上述文本的第二个下划线_和第一个连字符之间的单词-,因此所需的输出将是hijd.

我能够解析上面sed的内容,但它仅适用于上面的示例,并且我的文件名略有不同,因此我想在第二个下划线和第一个连字符之间显式解析。

4

5 回答 5

3

使用这个 sed 命令(在 Mac 上):

sed -E 's/^[^_]*_[^_]*_([^-]*)-.*$/\1/'

或(在 Linux 上):

sed -r 's/^[^_]*_[^_]*_([^-]*)-.*$/\1/'

使用 awk:

awk -F '_' '{sub(/-.*$/, "", $3); print $3}'
于 2013-05-17T12:51:57.150 回答
3
$ foo='abc_defg_hijd-3.29.0-2_el6_11h.txt'
$ bar=${foo%%-*}                # remove everything after the first -
$ bar=${bar#*_}; bar=${bar#*_}  # remove everything before the second _
$ echo "${bar}"
hijd
于 2013-05-17T12:56:42.693 回答
2

grep的诞生就是为了提取:

grep -oP '[^_-]*_\K[^_-]*(?=-)'

例子

kent$  echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt'|grep -oP '[^_-]*_\K[^_-]*(?=-)'
hijd

awk是用于文本处理的核弹,但它肯定可以杀死苍蝇:

awk -F- 'split($1,a,"_")&&$0=a[3]'

或更短(傻瓜):

awk -v FPAT="[^-_]*" '$0=$3'

例子

kent$  echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt'|awk -F- 'split($1,a,"_")&&$0=a[3]'  
hijd


kent$  echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt'|awk -v FPAT="[^-_]*" '$0=$3'
hijd
于 2013-05-17T13:04:48.493 回答
0

GNU sed

echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt' | 
sed 's/\([^_]\+_\)\{2\}\([^-]\+\)-.*/\2/g'
hijd
于 2013-05-17T12:55:18.383 回答
0

窗口批处理:

for /f "tokens=3delims=_-" %%i in ("abc_defg_hijd-3.29.0-2_el6_11h.txt") do echo %%i
hijd
于 2013-05-18T15:04:36.747 回答