#!/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
的链接答案 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"