2016-05-12 48 views
0
#!/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修飾符會有所幫助,但它似乎並沒有解決這個問題。Sed:在整個第二捕獲組中添加引號

繼承人到regex101

+2

不相關但記得要引用你的變量擴展,否則他們會經歷分詞,也考慮在sed表達式中使用單引號:'echo「$ TEST」| sed -re'...'' – andlrc

+1

s /考慮/ always/ –

+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-|$)/"$&"/' 
0

爲了讓你從輸入張貼的輸出你發佈的只是:

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

如果這還不夠,請編輯您的問題以顯示一些更真實的代表性樣本輸入和預期輸出。

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" 
+0

預期輸出如上所述。 – Zee

+0

@Zee,不是預期的輸出,而是期望的字符串(或輸入,而是)。基本上說,我們不確定還有什麼其他的$ TEST可以,或者你可能期望$ TEST是什麼。我確信還有其他的$ TEST選項,但是如果沒有,我們可以很容易地給你一個非常直接的正則表達式來解決這個**特定的**字符串。例如,這可以解決您的問題: 'echo「$ TEST」| sed -re「s /( - extra-vars \ s)([a-zA-Z0-9 \ =] * d)/ \ 1 \」\ 2 \「/ g」',但這隻有在您期望你的第二組總是以我懷疑的'd'結尾。 – drewyupdrew