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。非常简单!谢谢!