需要使用sed解析文本的第二个下划线和第一个连字符

时间:2013-05-17 12:45:31

标签: bash shell sed

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

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

我能够用上面的sed来解析上面的内容,但它只适用于上面的例子,我的文件名稍有不同,因此我想在第二个下划线和第一个之间明确解析连字符。

5 个答案:

答案 0 :(得分:3)

使用此sed命令(在Mac上):

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

OR(在Linux上):

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

使用awk:

awk -F '_' '{sub(/-.*$/, "", $3); print $3}'

答案 1 :(得分: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

答案 2 :(得分: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]'

或更短(gawk):

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

答案 3 :(得分:0)

GNU sed

echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt' | 
sed 's/\([^_]\+_\)\{2\}\([^-]\+\)-.*/\2/g'
hijd

答案 4 :(得分:0)

windows批处理:

for /f "tokens=3delims=_-" %%i in ("abc_defg_hijd-3.29.0-2_el6_11h.txt") do echo %%i
hijd