Bash 如何从字符串中提取两段数据

Bash 如何从字符串中提取两段数据,bash,Bash,我试图从一个字符串中提取两段数据,但遇到了一些问题。字符串的格式如下所示: 11111111-2222:3333:4444:55555555555555aaaaaa:bbbbbbbb:cccccc:dddddddd 我试图实现的是在同一行上打印冒号字符串的第一列(11111111-2222:3333:4444:555555)和第三部分(CCCC),这两部分之间有一个空格,因为第一列是一个标识符。理想情况下,可以从终端以一条线路的方式运行 我已经尝试过使用cut和awk,但是我还没有找到一个好的方

我试图从一个字符串中提取两段数据,但遇到了一些问题。字符串的格式如下所示:

11111111-2222:3333:4444:55555555555555aaaaaa:bbbbbbbb:cccccc:dddddddd

我试图实现的是在同一行上打印冒号字符串的第一列(11111111-2222:3333:4444:555555)和第三部分(CCCC),这两部分之间有一个空格,因为第一列是一个标识符。理想情况下,可以从终端以一条线路的方式运行


我已经尝试过使用cut和awk,但是我还没有找到一个好的方法来实现这一点。

像这样的sed表达式怎么样

echo "11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd" |
sed -e "s/\(.*\) .*:.*:\(.*\):.*/\1 \2/"
结果:

11111111-2222:3333:4444:555555555555 cccccccc

像这样的sed表达式怎么样

echo "11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd" |
sed -e "s/\(.*\) .*:.*:\(.*\):.*/\1 \2/"
结果:

11111111-2222:3333:4444:555555555555 cccccccc

我认为用户803422的答案更好,但这里有另一个选项。也许它会帮助你将来使用
cut

str='11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd'
first=$(echo "$str" | cut -d ' ' -f1)
second=$(echo "$str" | cut -d ':' -f6)
echo "$first $second"

我认为用户803422的答案更好,但这里有另一个选项。也许它会帮助你将来使用
cut

str='11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd'
first=$(echo "$str" | cut -d ' ' -f1)
second=$(echo "$str" | cut -d ':' -f6)
echo "$first $second"

下面的
awk
脚本不依赖于第一列的格式执行此任务

awk -F: 'BEGIN {RS=ORS=" "} NR==1; NR==2 {print $3}'

在管道中使用它,或将字符串作为文件传递(只需将文件名作为参数附加)或作为此处字符串传递(附加
以下
awk
脚本不依赖第一列的格式执行此操作

awk -F: 'BEGIN {RS=ORS=" "} NR==1; NR==2 {print $3}'
在管道中使用它,或将字符串作为文件(只需将文件名作为参数附加)或作为here字符串(使用纯Bash Regex附加

str='11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd'
echo "$([[ $str =~ (.*\ ).*:.*:([^:]*) ]])${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
说明:

  • [$str=~(.*).*:([^:]*]
    :将
    $str
    与POSIX扩展正则表达式
    (.*).*:([^::]*)
    匹配,其中包含两个捕获组:1:
    (.*)
    任何字符中的0个或多个,后跟一个空格;以及捕获组2:
    ([^:]
    开关包含任意数量的非
    字符:

  • $([[$str=~(.*\).*:([^:]*)]]
    :在字符串值扩展期间在子shell中执行正则表达式匹配(此处不生成输出,但稍后将引用正则表达式捕获的组)

  • ${BASH_REMATCH[1]}${BASH_REMATCH[2]}
    :展开BASH保存在专用
    $BASH_REMATCH
    数组中的正则表达式捕获组的内容

    • 使用纯Bash正则表达式:

      str='11111111-2222:3333:4444:555555555555 aaaaaaaa:bbbbbbbb:cccccccc:dddddddd'
      echo "$([[ $str =~ (.*\ ).*:.*:([^:]*) ]])${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
      
      说明:

      • [$str=~(.*).*:([^:]*]
        :将
        $str
        与POSIX扩展正则表达式
        (.*).*:([^::]*)
        匹配,其中包含两个捕获组:1:
        (.*)
        任何字符中的0个或多个,后跟一个空格;以及捕获组2:
        ([^:]
        开关包含任意数量的非
        字符:

      • $([[$str=~(.*\).*:([^:]*)]]
        :在字符串值扩展期间在子shell中执行正则表达式匹配(此处不生成输出,但稍后将引用正则表达式捕获的组)

      • ${BASH_REMATCH[1]}${BASH_REMATCH[2]}
        :展开BASH保存在专用
        $BASH_REMATCH
        数组中的正则表达式捕获组的内容


      说清楚点,你要找的输出是:
      11111111-2222:3333:4444:5555555555CCCCCC
      ?说清楚点,你要找的输出是:
      11111-2222:3333:4444:5555555555CCCCCC
      ?喜欢这个!
      awk
      太棒了。希望我能听清楚。我补充了一些解释。喜欢这个!
      awk
      太棒了。真希望我能更好地理解它。听到这个,我补充了一些解释。