首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH:如果在同一文本文件行上发现两次模式,则匹配

BASH:如果在同一文本文件行上发现两次模式,则匹配
EN

Stack Overflow用户
提问于 2013-09-26 14:35:35
回答 3查看 1.2K关注 0票数 1

如果我能创建一个像这样的文件.

/VAULT14/620100_V14/620054 VOL1620054

我怎样才能得到bash来比较最后的2*6位数字,例如,只有在行读时才匹配,例如

/VAULT14/620100_V14/620054 VOL1620541

本质上,我所拥有的是到磁带系统上的虚拟磁带的路径列表,在同一行中,该磁带的实际VOL1磁带头标签是什么。

我关心的是标签(VOL1)是否与实际的虚拟磁带文件名不匹配。

我确实尝试过使用awk,但肯定遗漏了一些东西:

代码语言:javascript
复制
echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-6)) == substr($2,(length($2)-6))) print "Same"; else print "Different" }'

当我认为应该返回Different时返回Same

编辑:由于@的评论,我意识到我实际上从长度上取了一个太多的字符,所以/620054永远也比不上1620054

更新后的代码是:

代码语言:javascript
复制
echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-5)) == substr($2,(length($2)-5))) print "Same"; else print "Different" }'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-26 15:44:31

你想要这样的东西:

代码语言:javascript
复制
egrep '([0-9]{6}\>).*\1$' <file>
票数 2
EN

Stack Overflow用户

发布于 2013-09-26 16:07:25

使用perl兼容的正则表达式\d{6}\b在单词(或字符串末尾)的末尾查找6位数字。

代码语言:javascript
复制
while read line; do
    set -- $(grep -oP '\d{6}\b' <<< "$line")
    if (( $1 == $2 )); then
        echo "same -- $line"
    else
        echo "diff -- $line"
    fi
done << END
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
END
代码语言:javascript
复制
same -- /VAULT14/620100_V14/620054 VOL1620054
diff -- /VAULT14/620100_V14/620054 VOL1620541
票数 3
EN

Stack Overflow用户

发布于 2013-09-26 15:58:31

纯bash溶液:

代码语言:javascript
复制
#!/bin/bash

while read line; do
    if [[ $line =~ /([0-9]{6})[\ \t]+VOL[0-9]*([0-9]{6}) ]] && \
        [[ ${BASH_REMATCH[1]} = ${BASH_REMATCH[2]} ]]; then
        echo same:$line
    else
        echo different:$line
    fi
done

保存为例如,2match,然后chmod +x 2match,然后运行:

代码语言:javascript
复制
$ cat vault.txt 
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
$ ./2match < vault.txt 
same:/VAULT14/620100_V14/620054 VOL1620054
different:/VAULT14/620100_V14/620054 VOL1620541
$ 

正则表达式可能比需要的要复杂一些--我不确定输入行的格式有多大的灵活性。

显然,您可以将echo语句更改为您想要的任何内容--我只是打印出了相同的/不同的以及用于检查的整行内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19031177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档