Sed:在整个第二个捕获组周围添加引号

时间:2016-05-12 16:51:15

标签: regex bash sed

#!/bin/bash

TEST="--extra-vars user=jsmith a=abcd --test"
echo $TEST | sed -re "s/(--extra-vars\s)([a-zA-Z0-9\=\s]*)/\1\"\2\"/g"

我使用sed在整个第二个捕获组周围添加文字引号但由于某种原因它只是部分引用该组。此预期输出为--extra-vars "user=jsmith a=abcd" --test,但我看到--extra-vars "user=jsmith" a=abcd --test。我认为使用全局sed修饰符会有所帮助,但它似乎没有解决问题。

这是指向regex101

的链接

3 个答案:

答案 0 :(得分:1)

AFAIK您需要在角色类中使用[:space:]

TEST="--extra-vars user=jsmith a=abcd --test"
echo "$TEST" | sed -re 's/(--extra-vars\s)([a-zA-Z0-9\=[:space:]]*)/\1"\2"/g'
#                                                       ^
#                                                       Use [:space:]

但是这也包括abcd之后的最后一个空格:

--extra-vars "user=jsmith a=abcd "--test

防止这种情况的一种方法是在搜索结束时添加(\s-)*并在替换时添加\3

TEST="--extra-vars user=jsmith a=abcd --test"
echo "$TEST" | sed -re 's/(--extra-vars\s)([a-zA-Z0-9\=[:space:]]*)(\s-)*/\1"\2"\3/g'

给出了:

--extra-vars "user=jsmith a=abcd" --test

你也可以考虑使用像Perl这样有PCRE的东西:

echo "$TEST" | perl -pe 's/(?<=--extra-vars\s).*?(?=\s-|$)/"$&"/'

答案 1 :(得分:0)

要从您发布的输入中获取的结果只是:

TEST="--extra-vars user=jsmith a=abcd --test"
$ echo "$TEST" | sed 's/ \(.*\) / "\1" /'
--extra-vars "user=jsmith a=abcd" --test

如果这还不够,请编辑您的问题以显示更具真实代表性的样本输入和预期输出。

答案 2 :(得分:0)

请注意,如果您为第二组使用[:space:]实际空格字符(即([a-zA-Z0-9\= ]*),它会执行您想要的操作,但它会匹配abcd之后的空格:

--extra-vars "user=jsmith a=abcd "--test

因此,请使用其中一个,但您必须调整正则表达式以执行您想要的操作。我们很难给你一个正则表达式,因为我们不确定你期望什么样的字符串,但这可能会起作用:

echo "$TEST" | sed -re "s!(--extra-vars\s)([a-zA-Z0-9\=]*\s)([a-zA-Z0-9\=]*)!\1\"\2\3\"!g"
相关问题