Bash脚本:在字符后读取文本

时间:2014-08-19 16:59:39

标签: linux bash shell

我希望在文件中的字符后阅读文字。

例如:

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脚本中执行此操作?

6 个答案:

答案 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