Linux Bash脚本:读取字符后的文本

Linux Bash脚本:读取字符后的文本,linux,bash,shell,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|| 我想阅读程序的版本(在第三个框中): 如何在bash脚本中执行此操作?使用bash正则表达式: s='MPlayer-2013-08-30-i486|MPlayer|2

我想读取文件中字符后的文本

例如:

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||
我想阅读程序的版本(在第三个框中):

如何在bash脚本中执行此操作?

使用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 -F'|' '{ # do something with $3 }' file
awk-F'MPlayer-\\\\''{print$2}'使用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 -F'|' '{ # do something with $3 }' file

awk-F'MPlayer-\\\\''{print$2}'使用
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
while read version; do
    # do something with $version
done < <(cut -d'|' -f3 file)

这将在
|
上拆分并选择第三个字段。

使用
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
while read version; do
    # do something with $version
done < <(cut -d'|' -f3 file)
将在
|
上拆分并选择第三个字段。

使用
读取
(所有shell):

输出:

2013-08-30-i486
使用
读取
(所有外壳):

输出:

2013-08-30-i486

这在AWK中很容易做到:

$ awk -F'|' '{print $3}' file
2013-08-30-i486

似乎相同的数据在几个地方重复,所以我假设它们都可以使用……在上面的一行中,输入被拆分为
字符上的字段,第三个字段正在打印。每一行输入都会发生同样的情况。

在AWK中,这很简单:

$ awk -F'|' '{print $3}' file
2013-08-30-i486
似乎相同的数据在几个地方重复,所以我假设它们都可以使用……在上面的一行中,输入被拆分为
字符上的字段,第三个字段正在打印。每一行输入都会发生同样的情况。

通过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
通过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

内置的
读取
对于单行来说效率最高:

IFS="|" read __ __ version __ <<< "$line"
awk

awk -F 'MPlayer-|\\|' '{print $2}' <<< "$s"
2013-08-30-i486
awk -F'|' '{ # do something with $3 }' file

内置的
读取
对于单行来说效率最高:

IFS="|" read __ __ version __ <<< "$line"
awk

awk -F 'MPlayer-|\\|' '{print $2}' <<< "$s"
2013-08-30-i486
awk -F'|' '{ # do something with $3 }' file

要多次提取特征的零件。有时它们会不同吗,例如,使用哪一行有关系吗?您是否需要将其应用于一行,或者应用于文件中的(可能是多行)。您希望多次提取特征的部分。有时它们会不同吗,例如,使用哪一行有关系吗?您是否需要将此应用于一个文件中的一行,或者(可能是多行)。此选项非常简单和简短。非常感谢你!没问题。实际上,如果从文件中读取,它会更短。这个选项非常简单和简短。非常感谢你!没问题。如果从文件中读取,实际上会更短。或者(因为OP显然喜欢使用短线,
cut-d\|-f3 file
从文件中提取字段,而不是stdin。非常简单!谢谢!或者(由于OP显然倾向于使用短线,
cut-d\|-f3 file
从文件中提取字段,而不是stdin。非常简单!谢谢!