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
太棒了。真希望我能更好地理解它。听到这个,我补充了一些解释。