![](/img/trans.png)
[英]Bash / Shell / Perl - How to replace variable amount of white space with a single space?
[英]How do I search and replace a string after an arbitrary amount of white space in bash?
我正在使用 bash shell。 我有一個僅包含該行的文本文件
name "Test Program"
我想在名稱后的字符串周圍添加花括號,使文件看起來像
name { “Test Program" }
我嘗試了以下表達式
perl -pi -e 's/name(\s+)"(.*)"/name$1{ "$2" }/g' /tmp/test.txt
但最終得到的文件僅包含
name
我是否誤解了關於任意空白 (\s) 或替換的內容?
perl -pi -e 's/name(\s+)"(.*)"/name$1{ "$2" }/g' /tmp/test.txt
在這里, $1{ "$2" }
被解釋為“ %1
哈希的$2
鍵”。
在$1
變量周圍加上大括號以消除擴展的歧義:
perl -pi -e 's/name(\s+)"(.*)"/name${1}{ "$2" }/g' /tmp/test.txt
# ..................................^.^
或逃脫開括號
perl -pi -e 's/name(\s+)"(.*)"/name$1\{ "$2" }/g' /tmp/test.txt
# ...................................^
或者,使用\K
運算符
perl -pi e 's/name\s+\K(".*")/{ $1 }/' test.txt
假設只有一對雙引號,並且不限於perl
解決方案......
使用sed
一個想法:
sed -E 's/("[^"]*")/{ \1 }/' test.txt
在哪里:
-E
- 啟用擴展正則表達式(和捕獲組)("[^"]*")
- (捕獲組)匹配一個"
+0個或多個non-"
字符+ "
{ \1 }
- 將匹配替換為{
+ capture group + }
這會產生:
name { "Test Program" }
一旦滿意結果是正確的,您可以添加-i
標志以對源文件進行更改,例如:
$ cat test.txt
name "Test Program"
$ sed -Ei 's/("[^"]*")/{ \1 }/' test.txt
$ cat test.txt
name { "Test Program" }
嘗試使用 sed:
cat test.txt | sed 's/^name[ ]\+/name { /g' | sed 's/["][ ]*$/" }/g'
您可以使用此perl
命令:
perl -i -pe 's/(name\s+)("[^"]+")/$1 { $2 }/' file
cat file
name { "Test Program" }
或者這個sed
:
sed -i.bak -E 's/(name[[:blank:]]+)("[^"]+")/\1 { \2 }/' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.