【问题标题】:Need help for string manipulation in a bash script需要 bash 脚本中的字符串操作帮助
【发布时间】:2017-04-14 07:30:34
【问题描述】:

我不习惯 bash 脚本的语法。我正在尝试读取文件。对于每一行,我只想保留分隔符“/”之前的字符串部分,如果单词尊重特定长度,则将其放回新文件中。我已经下载了字典,但格式不符合我的期望。由于有 84000 个单词,我真的不想手动删除每个单词的“/”之后的内容。我虽然这将是一件容易的事情,并且我在此站点上的其他类似问题中遵循了几个想法,但似乎我在某处遗漏了一些东西,因为它仍然不起作用。我无法获得正确的长度。文件 Test_Input 每行包含一个单词。代码如下:

#!/usr/bin/bash
filename="Test_Input.txt"
while read -r line
do
    sub= echo $line | cut -d '/' -f1
    length= echo ${#sub}
    if $length >= 4 && $length <= 10;
        then echo $sub >> Test_Output.txt
    fi
done < "$filename"

【问题讨论】:

    标签: bash substring string-length


    【解决方案1】:

    几个项目:

    1. 我假设您一直在作业中使用单反引号,而不是字面意义上的sub= echo $line | cut -d '/' -f1,因为这肯定会失败。或者,您也可以使用sub=$(),如$(echo $line | cut -d '/' -f1)
    2. if 子句中的条件需要包含在单个或两个 [] 中,例如:if [[ $length -ge 4 ]] &amp;&amp; [[ $length -le 10 ]];
    3. 这让我想到了下一点:&lt;= 在 bash 中不能可靠地工作。只需使用-ge 表示“大于或等于”,使用-le 表示“小于或等于”。
    4. 如果您的行不包含任何/ 字符,则在您的版本中sub 将包含整行。这可能不是您想要的,所以我建议您也将-s 标志添加到cut
    5. 你不需要somevar=$(echo $someothervar)。只需使用somevar=$someothervar

    这是一个可行的版本:

    #!/usr/bin/env bash
    filename="Test_Input.txt"
    while read -r line
    do
        sub=$(echo $line | cut -s -d '/' -f 1)
        length=${#sub}
        if [[ $length -ge 4 ]] && [[ $length -le 10 ]];
            then echo $sub >> Test_Output.txt
        fi
    done < "$filename"
    

    当然,你也可以只使用sed

    sed -n -r '/^[^/]{4,10}\// s;/.*$;;p' Test_Input.txt > Test_Output.txt
    

    解释:

    • -n 除非明确标记为打印,否则不要打印任何内容。
    • -r 使用扩展正则表达式
    • /&lt;searchterm&gt;/ &lt;operation&gt; 搜索符合特定条件的行,并执行此操作:
      • 搜索词为:^[^/]{4,10}\/ 从行首开始,应有 4 到 10 个非斜杠字符,后跟斜杠
      • 操作是:s;/.*$;;p 将第一个斜杠和行尾之间的所有内容替换为空,然后打印。

    【讨论】:

    • 稍微精确一点,双精度[[ 根本不起作用,我使用单精度。非常感谢!我知道我不是很远! :)
    • 终于[[ 工作正常!似乎使用sh ./script.sh 而不是bash ./script.sh 加载我们的脚本具有较少的兼容性。
    【解决方案2】:

    awk 是最好的工具

    awk -F/ 'length($1) &gt;= 4 &amp;&amp; length($1) &lt;= 10 {print $1} &gt; newfile

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      相关资源
      最近更新 更多