我希望在文件中的字符后阅读文字。
例如:
MPlayer-2013-08-30-i486|MPlayer|2013-08-30-i486||Multimedia;video|4508K||MPlayer-2013-08-30-i486.pet|+ffmpeg|mplayer video player|slackware|14.0||
我想阅读该程序的版本(在第三个框中):
2013-08-30-i486
我如何在我的bash脚本中执行此操作?
答案 0 :(得分:3)
使用BASH正则表达式:
s='MPlayer-2013-08-30-i486|MPlayer|2013-08-30-i486||Multimedia;video|4508K||MPlayer-2013-08-30-i486.pet|+ffmpeg|mplayer video player|slackware|14.0||'
[[ "$s" =~ MPlayer-([^|]+) ]] && echo "${BASH_REMATCH[1]}"
2013-08-30-i486
使用awk
:
awk -F 'MPlayer-|\\|' '{print $2}' <<< "$s"
2013-08-30-i486
使用awk获取第3个字段:
awk -F '\\|' '{print $3}' <<< "$s"
2013-08-30-i486
答案 1 :(得分:3)
使用cut
:
echo 'MPlayer-2013-08-30-i486|MPlayer|2013-08-30-i486||Multimedia;video|4508K||MPlayer-2013-08-30-i486.pet|+ffmpeg|mplayer video player|slackware|14.0||' | cut -d '|' -f 3
2013-08-30-i486
将在|
上拆分并选择第3个字段。
答案 2 :(得分:3)
这在AWK中很简单:
$ awk -F'|' '{print $3}' file
2013-08-30-i486
似乎在几个地方重复相同的数据,所以我认为它们都可以使用...在上面的行中,输入被分成|
字符和字段上的字段第三个领域正在印刷。每一行输入都会发生同样的事情。
答案 3 :(得分:1)
使用read
(所有炮弹):
IFS='|' read __ __ VERSION __ < file
echo "$VERSION"
另一个使用read -a
和Bash数组:
IFS='|' read -a FIELDS < file
echo "${FIELDS[2]}"
输出:
2013-08-30-i486
答案 4 :(得分:1)
通过grep,
$ grep -oP 'MPlayer-\K[^|.]*(?=\|)' file
2013-08-30-i486
通过sed,
$ echo 'MPlayer-2013-08-30-i486|MPlayer|2013-08-30-i486||Multimedia;video|4508K||MPlayer-2013-08-30-i486.pet|+ffmpeg|mplayer video player|slackware|14.0||' | sed -r 's/^[^|]+\|[^|]+\|([^|]+).*$/\1/'
2013-08-30-i486
答案 5 :(得分:1)
read
内置对单行最有效:
IFS="|" read __ __ version __ <<< "$line"
虽然如果您使用
处理一个充满此类行的文件while IFS="|" read __ __ version __; do
# do something with $version
done < file
使用cut
可能更有效:
while read version; do
# do something with $version
done < <(cut -d'|' -f3 file)
或awk
:
awk -F'|' '{ # do something with $3 }' file