【问题标题】:How can I extract text from between two delimiters on a line in bash? [duplicate]如何从bash中一行的两个分隔符之间提取文本? [复制]
【发布时间】:2010-04-09 08:08:50
【问题描述】:

什么是我可以用 bash 编写的正则表达式,用于解析一行并提取可以在两行之间找到的文本 | (例如:1:|嘿| 2:|boy|)并将这些单词保存在某种数组中?

【问题讨论】:

  • 你的例子是“ex: 1: |hey| 2: |boy|”吗要解析的示例行或解析行的结果?如果是后者,产生这些结果的采样线是什么?我可以想到多种方法,但它们取决于您的输入是什么样的,而哪种方法“最好”取决于您接下来对“数组”做什么。
  • 示例是一个示例 LINE。事实上,这个例子可以换行。
  • 我想要对数组做的就是以特殊格式的顺序打印出来(比如中间的逗号)并对其进行排序

标签: regex bash


【解决方案1】:

不需要复杂的正则表达式。在“|”上拆分,然后每个第二个元素都是你想要的

#!/bin/bash
declare -a array
s="|hey| 2: |boy|"
IFS="|"
set -- $s
array=($@)
for((i=1;i<=${#array[@]};i+=2))
do
 echo ${array[$i]}
done

输出

$ ./shell.sh
hey
boy

使用 awk

$ echo s="|hey| 2: |boy|" |  awk -F"|" '{for(i=2;i<=NF;i+=2)print $i}'
hey
boy

【讨论】:

  • +1 很好地使用了 IFS、set 和 ()。但是,如果左右分隔符不同(例如,'')并且顺序有意义,或者分隔符是多字符(例如,“--”),则此方法将不起作用。恕我直言,正则表达式方法更通用/更灵活。
  • 使其更灵活也不难。在 OP 要求之前,它将保持原样。
【解决方案2】:
$ foundall=$(echo '1: |hey| 2: |boy|' | sed -e 's/[^|]*|\([^|]\+\)|/\1 /g')
$ echo $foundall
hey boy
$ for each in ${foundall}
> do
>  echo ${each}
> done
hey
boy

【讨论】:

    【解决方案3】:

    使用sed -e 's,.*|\(.*\)|.*,\1,'

    【讨论】:

      【解决方案4】:

      在您自己的答案中,您输出最后一对管道之间的内容(假设一行中有两个以上的管道)。

      这将输出第一对之间的内容:

      sed -e 's,[^|]*|\([^|]*\)|.*,\1,'
      

      这将输出最外面的一对之间的内容(因此它将显示出现在它们之间的管道):

      sed -e 's,[^|]*|\(.*\)|.*,\1,'
      

      【讨论】:

        【解决方案5】:
        #!/bin/bash
        
        _str="ex: 1: |hey| 2: |boy|"
        _re='(\|[^|]*\|)(.*)'  # in group 1 collect 1st occurrence of '|stuff|';
                               # in group 2 collect remainder of line. 
        
        while [[ -n $_str ]];do
           [[ $_str =~ $_re ]]
           [[ -n ${BASH_REMATCH[1]} ]] && echo "Next token is '${BASH_REMATCH[1]}'"
           _str=${BASH_REMATCH[2]}
        done
        

        产量

        Next token is '|hey|'
        Next token is '|boy|'
        

        【讨论】:

          猜你喜欢
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 2017-04-13
          • 2012-11-27
          • 1970-01-01
          • 2018-06-20
          • 1970-01-01
          相关资源
          最近更新 更多