【问题标题】:How to create a tokenization tool in bash script? [duplicate]如何在 bash 脚本中创建标记化工具? [复制]
【发布时间】:2020-03-24 08:39:57
【问题描述】:

我需要创建一个工具来标记输入列表。 我将通过以下方式提供一个包含子域列表的文本文件:

abc.xyc.kkk.com
hjk.pol.lll.kkk.com
...

输出需要是:

abc
xyz
kkk
hjk
...

分隔符是'.'

我已经尝试了以下代码,但似乎不起作用:

#!/bin/bash

STRING= cat $1
IFS='.' read -ra VALUES <<< "$STRING"

## To print all values
for i in "${VALUES[@]}"; do
    echo $i
done

【问题讨论】:

标签: bash token


【解决方案1】:

您的脚本有一些错误,我已更正。现在可以了:

#!/bin/bash

STRING='
abc.xyc.kkk.com hjk.pol.lll.kkk.com
'

IFS=' ' read -d '' -a VALUES <<< "$STRING"

for i in ${VALUES[@]}; do
    echo "$i" | sed 's/\./ /g' 
done

输出

abc xyc kkk com
hjk pol lll kkk com

顺便说一句,如果你想在数组中包含每个标记,而不是整个 url,你可以这样做:

#!/bin/bash

STRING='
abc.xyc.kkk.com hjk.pol.lll.kkk.com
'

IFS='.' read -d '' -a VALUES <<< "$STRING"

for i in ${VALUES[@]}; do
    echo "$i" | sed 's/\./ /g' 
done

输出

abc
xyc
kkk
com
hjk
pol
lll
kkk
com

让我知道它是否有效!

【讨论】:

  • "${VALUES[@]}",否则有${VALUES[*]}的所有bug。
  • 而且使用${i//./ } 比使用sed 效率更高。
  • 不过,更一般地说,如果一个问题没有指定 一个单一错误 并用最短的代码重现它,则应该关闭,因为它太宽泛,没有回答(或关闭作为重复,每个特定/较窄的问题都隐藏在较大/较宽的问题中)。
【解决方案2】:

awk 之类的东西可以完成这项工作:

awk 'BEGIN {FS="."; RS=" "} {$NF=""} 1'

这是测试:

$ echo abc.xyc.kkk.com hjk.pol.lll.kkk.com |awk 'BEGIN {FS="."; RS=" "} {$NF=""} 1'
abc xyc kkk
hjk pol lll kkk

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2017-01-26
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2020-07-07
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多