【问题标题】:How to parse a string with multiple characters to split on-Bash Scripting如何解析具有多个字符的字符串以拆分 on-Bash 脚本
【发布时间】:2021-11-26 20:59:58
【问题描述】:

我有一个包含以下内容的文本文件:

文件夹4/file2folder4.txt >> 文件夹2/folder2_1/file1folder2.txt

我有一个脚本,可以按如下方式解析每一行

while IFS=" >> " read -r src dest
do 

    if [ "$src" != "" ]; then
        SOURCEFILES+=("$src")
    fi
    if [ "$dest" != "" ]; then  
        DESTINATIONFILES+=("$dest")
    fi  
done < $TransferDescriptor

解析如下:

SOURCEFILE="folder4/file2folder4.txt"

DESTINATION="> folder2/folder2_1/file1folder2.txt"

但我想要什么

SOURCEFILE="folder4/file2folder4.txt"

DESTINATION="folder2/folder2_1/file1folder2.txt"

任何帮助。谢谢

【问题讨论】:

    标签: bash


    【解决方案1】:

    IFS 中不能有多个字符串。它只支持将单个字符用作输入字段分隔符。

    你可以像这样使用 BASH 正则表达式:

    while IFS= read -r line; do
       if [[ $line =~ $re ]] ; then
          srcfile="${BASH_REMATCH[1]}"
          dest="${BASH_REMATCH[2]}"
       fi
    done < file
    

    检查我们的变量:

    declare -p srcfile dest
    declare -- srcfile="folder4/file2folder4.txt"
    declare -- dest="folder2/folder2_1/file1folder2.txt"
    

    【讨论】:

      【解决方案2】:

      IFS 不是单个多字符分隔符;相反,它是单字符分隔符的集合。您可以使用正则表达式来拆分由任意分隔符分隔的两个字段。

      regex='(.*) >> (.*)'
      while IFS= read -r line dest
      do 
          [[ $line =~ $regex ]] || continue
          src=${BASH_REMATCH[1]}
          dest=${BASH_REMATCH[2]}
      
          if [[ -n $src ]]; then
              SOURCEFILES+=("$src")
          fi
          if [[ -n $dest ]]; then  
              DESTINATIONFILES+=("$dest")
          fi  
      done < "$TransferDescriptor"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        相关资源
        最近更新 更多