首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中读取行并标记每一行,以提取shell脚本中的特定单词。

从文件中读取行并标记每一行,以提取shell脚本中的特定单词。
EN

Stack Overflow用户
提问于 2020-03-29 11:22:55
回答 1查看 493关注 0票数 0

我编写了一个shell脚本来读取文件中的所有行,标记每一行以提取特定的单词。第一行读得正确,但从第二行看,预期的单词没有正确阅读。期待你的建议。

代码语言:javascript
复制
while read -ra line; 
    do
        netmask="${line[5]}"
        echo "netmask is $netmask" // first line reading is correct, second line onwards its showing 
                                      wrong output
        IFS='.' tokens=($netmask) 
        prefix=0
        for i in 0 1 2 3
        do
            var="${tokens[$i]}"
            # i have a logic to calculate number of 1's in the number.
        done 
done < routes.sh

route.sh的内容如下

代码语言:javascript
复制
route add -net 10.212.220.0 netmask 255.255.255.0 gw 10.213.248.1
route add -net 10.212.220.0 netmask 255.255.128.0 gw 10.213.248.1

实际输出

代码语言:javascript
复制
netmask is 255.255.255.0
netmask is 128

预期产出

代码语言:javascript
复制
netmask is 255.255.255.0
netmask is 255.255.128.0

额外注意事项:

我的目标是(网络概念)

从文件(每一行描绘一条路由)中读取所有行,从每一行提取网络掩码(例如: 255.255.255.255)

  • Tokenize "255.255.255.255“与'.',因此我们得到4个数字,计算每个令牌中的1s数,并将它们相加。这将是网络IP.

的前缀长度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-29 13:39:36

问题是您设置了IFS='.',因此对于数组上的第二个readline将被错误地设置。

修复它的一种方法是保存原始的IFS,然后在适当的时候重置它。例如,

代码语言:javascript
复制
OldIFS=$IFS
while read -ra line; do
    netmask="${line[5]}"
    echo "netmask is $netmask"
    IFS='.' tokens=($netmask)
    prefix=0
    for i in 0 1 2 3; do
        var="${tokens[$i]}"
    done
    IFS=$OldIFS
done < routes.sh

您在更改IFS时必须小心,否则会发生奇怪的事情。

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

https://stackoverflow.com/questions/60913463

复制
相关文章

相似问题

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