簡體   English   中英

如何在 bash 中的任意數量的空格之后搜索和替換字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM