Bash - 从字符串中提取字符

Bash - 从字符串中提取字符

假设我有以下变量

$string = 'cat somecommandhere'

现在上面命令的输出cat

test="Thanks serverfault"

我想提取引号之间的值并将其存储在同一变量中$string,包括引号。我希望字符串包含以下值:

$string = "Thanks serverfault"  

sed这怎么能用or来完成,grep而不是awk.我还没学会awk

答案1

我将使用cut, 因为很容易推断出这-f2意味着“第二部分”并且-d'"'意味着在双引号上剪切。

$ output='test="Thanks serverfault"'
$ string=$( echo $output | cut -f2 -d'"' )
$ echo $string
Thanks serverfault

如果您确实想要引号,您可以自己将它们添加回来,这只会使答案看起来比实际需要的更加混乱。

如果你真的想使用sed(幸运的是,这也保留了引号):

$ output='test="Thanks serverfault"'
$ string=$( echo $output | sed 's/^test=//' )
$ echo $string
"Thanks serverfault"

的解释sed

                           s/^test=//
  string find/replace mode ^ |     ^ replace with nothing
                             starts with test=

答案2

不需要 sed; bash 和 sh 内置了变量修饰符:

$ output='test="Thanks serverfault"'
$ string=\"${output#*\"}
$ string=${string%\"*}\"
$ echo $string
"Thanks serverfault"

# 删除前缀,% 为后缀。

这应该比调用外部程序更快。

答案3

其他用户可能给出了最好的答案:不需要 sed。但如果你需要它,这应该可以工作:

sed 's/.*=//' #this will remove everything before (inclusive) of the equal.

答案4

使用 pcregrep:

string=$(eval " $string" | pcregrep -Mo '(?s)"(\\.|[^"])*"')

将评估 as shell 代码的内容$string,并从其输出中提取双引号字符串,处理可能转义的"s 和\,然后将其以换行符分隔存储在$string.

例如file=some-file string='cat < "$file"',其中some-file包含:

test="Thanks serverfault"
test2="with \"quotes\" and backslash\\" test3="multi
line"

$string最终将包含:

"Thanks severfault"
"with \"quotes\" and backslash\\"
"multi
line"

相关内容