我有一个rpm
文件,例如abc_defg_hijd-3.29.0-2_el6_11h.txt
.
我需要解析上述文本的第二个下划线_
和第一个连字符之间的单词-
,因此所需的输出将是hijd
.
我能够解析上面sed
的内容,但它仅适用于上面的示例,并且我的文件名略有不同,因此我想在第二个下划线和第一个连字符之间显式解析。
使用这个 sed 命令(在 Mac 上):
sed -E 's/^[^_]*_[^_]*_([^-]*)-.*$/\1/'
或(在 Linux 上):
sed -r 's/^[^_]*_[^_]*_([^-]*)-.*$/\1/'
使用 awk:
awk -F '_' '{sub(/-.*$/, "", $3); print $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
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
和GNU sed
echo 'abc_defg_hijd-3.29.0-2_el6_11h.txt' |
sed 's/\([^_]\+_\)\{2\}\([^-]\+\)-.*/\2/g'
hijd
窗口批处理:
for /f "tokens=3delims=_-" %%i in ("abc_defg_hijd-3.29.0-2_el6_11h.txt") do echo %%i
hijd