在bash中找到第4次出现模式后获取所有字符串

时间:2018-02-09 06:36:56

标签: regex bash shell

从字符串开始:

String=1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS.

在第4个冒号"之后匹配所有字符串所需的正则表达式:"并为shell脚本中的变量分配它,如:

var_result="Searching done for the string:SUCCESS."

3 个答案:

答案 0 :(得分:4)

使用shell(bash或POSIX)

$ string="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."
$ echo "${string#*:*:*:*:}"
Searching done for the string:SUCCESS.

${string#*:*:*:*:}前缀删除的示例。它删除了由四个以冒号分隔的字符串组成的前缀。

输出可以保存在shell变量中:

$ var_result=${string#*:*:*:*:}
$ echo "$var_result"
Searching done for the string:SUCCESS.

使用剪切

cut适用于此:

$ string="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."
$ cut -d: -f 5- <<<"$string"
Searching done for the string:SUCCESS.

以上选择第五个字段和所有后续字段,其中字段以冒号分隔。更具体地说,-d:告诉cut使用:作为字段分隔符,-f 5-告诉它选择字段5以及之后的所有内容。

要将输出保存在变量中,我们使用命令替换

$ var_result=$(cut -d: -f 5- <<<"$var")
$ echo "$var_result"
Searching done for the string:SUCCESS.

如果你只有一个POSIX shell而不是bash,那么我们需要使用echo

$ var_result=$(echo "$var" | cut -d: -f 5-)
$ echo "$var_result"
Searching done for the string:SUCCESS.

或者,更安全,printf

$ var_result=$(printf "%s" "$var" | cut -d: -f 5-)
$ echo "$var_result"
Searching done for the string:SUCCESS.

使用sed

以下使用sed删除冒号定义的前四个字段:

$ sed -E 's/([^:]*:){4}//' <<<"$string"
Searching done for the string:SUCCESS.

更具体地说:

  • [^:]匹配除:以外的任何字符。

  • [^:]*:匹配任意数量的非冒号后跟冒号。

  • ([^:]*:){4}恰好匹配四个冒号分隔的字段。

  • s/([^:]*:){4}//是一个替换命令,它会查找前四个以冒号分隔的列,并用空字符串替换它们。

以下内容相同,但会将结果保存在变量中:

$ var_result=$(sed -E 's/([^:]*:){4}//' <<<"$string")
$ echo "$var_result"
Searching done for the string:SUCCESS.

以下内容相同,但也适用于POSIX shell:

$ var_result=$(printf '%s' "$var" | sed -E 's/([^:]*:){4}//')
$ echo "$var_result"
Searching done for the string:SUCCESS.

答案 1 :(得分:0)

以下解决方案可能对您有所帮助。 让我们说以下是变量的值:

import serial
with serial.Serial('/dev/ttyS0',9600,8,serial.PARITY_NONE,serial.STOPBITS_ONE) as ser:
  for i in range(10):
    val = ser.read(2)

答案 2 :(得分:0)

使用bash正则表达式,您可以说:

String="1973251922:197325192278:abcdefgh:0xfff689990:Searching done for the string:SUCCESS."

if [[ $String =~ ^([^:]*:){4}(.+)$ ]]; then
    echo ${BASH_REMATCH[2]}
fi