假设我有以下变量
$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"