在linux中,如何从字符串中提取以用户定义的特殊字符开头和结尾的子字符串?

在linux中,如何从字符串中提取以用户定义的特殊字符开头和结尾的子字符串?,linux,bash,scripting,sed,awk,Linux,Bash,Scripting,Sed,Awk,我正在编写linux脚本,希望从主字符串中提取一个子字符串,如下例所示:- 主弦= 2011-12-03 11:04:22#Alex#Audrino^13b11254^Townville#USA# 我需要的是:- 子字符串= 13b11254 我只想阅读和提取^^特殊字符之间的任何内容 此代码将在linux脚本中使用。POSIX sh兼容: temp="${string#*^}" printf "%s\n" "${temp%^*}" 假定^每个字符串仅使用2x作为2个分隔符

我正在编写linux脚本,希望从主字符串中提取一个子字符串,如下例所示:-

主弦=

2011-12-03 11:04:22#Alex#Audrino^13b11254^Townville#USA#    
我需要的是:-

子字符串=

13b11254    
我只想阅读和提取^^特殊字符之间的任何内容

此代码将在linux脚本中使用。

POSIX sh兼容:

temp="${string#*^}"
printf "%s\n" "${temp%^*}"
假定
^
每个字符串仅使用2x作为2个分隔符。

使用标准shell参数扩展:


下面的解决方案使用
cut
实用程序,该实用程序生成一个进程,比shell参数扩展解决方案慢。它可能更容易理解,并且可以在文件上而不是在单个字符串上运行

s='2011-12-03 11:04:22#Alex#Audrino^13b11254^Townville#USA#'
echo $s | cut -d '^' -f 2

还可以使用bash数组和字段分隔符:

IFS="^"
s='2011-12-03 11:04:22#Alex#Audrino^13b11254^Townville#USA#'
array=($s)
echo ${array[1]}
这允许您测试是否有2个分隔符:

if [ ${#array[*]} -ne 3 ]
then
  echo error
else
  echo ok
fi

需要注意的是:您不需要引用赋值语句右侧的参数,因为在此上下文中它不受shell字段拆分或glob扩展的约束。当然,如果您觉得语法更具可读性,您可以这样做。@Dimitre谢谢-我知道,但总是将字符串放在引号中只是我个人的习惯/怪癖-我想这比另一种方式要好。谢谢您的回答,它解释了语法,而jw013展示了实用的方法
if [ ${#array[*]} -ne 3 ]
then
  echo error
else
  echo ok
fi