2015-04-14 53 views
1

我有一個這樣的文件:grep的後面添加文字:荷蘭國際集團說句話BASH

$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
] 

$password = [ 
    'aokroae', 
    '43t03it0i0i', 
    '430it935ti', 
] 

我需要創建一個bash腳本里grep如「$帳戶=」,並增加了新用戶在$賬戶中的行的結尾。 這將是最好的方式來做到這一點?

所以,如果我想通過bash腳本來添加用戶「邁克爾」,預期產出將被用於$帳戶:

$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
    'Michael', 
] 
+1

您的預期產出是? –

+0

更新了問題,所以應該更清楚。 – Kevin

+0

用戶列表的順序很重要,還是可以將新用戶插入列表頂部? – Wintermute

回答

1

用awk

這增加了邁克爾到列表的末尾:

awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file 
$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
    'Michael', 
] 

$password = [ 
    'aokroae', 
    '43t03it0i0i', 
    '430it935ti', 
] 

它是如何工作

  • /^[$]account/, /]/

    這個定義範圍內的行從開始與]

  • if (/]/) {print " '\''Michael'\'',";}

    結束對於該範圍內的行,如果行包含],然後加入邁克爾。

  • 1

    這是awk的打印的線神祕的簡寫。

使用sed的

$ sed "/^[$]account/,/]/ { /]/ s/^/ 'Michael',\n/}" file 
$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
    'Michael', 
] 

$password = [ 
    'aokroae', 
    '43t03it0i0i', 
    '430it935ti', 
] 

它是如何工作

這裏的邏輯是非常相似的是,在AWK代碼中使用:

  • /^[$]account/,/]/

    這高清分級表的行範圍的開始$account並用]

  • { /]/ s/^/ 'Michael',\n/}

    對於範圍內的線結束,此測試以查看是否該行包含]。如果是這樣的話,那麼邁克爾就會在這一行的開頭取代。

    我們不需要明確告訴sed它應該打印該行。 sed在默認情況下執行此操作。

+0

謝謝!其他答案也很好,但你的回答描述了awk和sed是如何使用的。 – Kevin

2

如果你可以將信息添加到的開始列表,它會更容易:

sed -e "/\$account = \[/a\ \ \ 'newuser'," 

a只是增加了匹配的一個後一個新行。

將其添加到年底,你可以使用SED,太:

sed -e '/[$]account = \[/bi;b;:i {n;/\]/{i \ '\'newuser\',$'\nb};bi}' 

說明:

  • bi跳轉到標籤i如果$account匹配。
  • 否則,b剛剛開始處理下一行。
  • i標籤引入了一個塊讀取下一行(n),如果它發現],它插入(i)新值,並開始處理正常的下一行(b)。
  • 否則,i塊會處理下一行(bi)。
0

您可以使用此GNU-AWK:

awk -v sq="'" -v RS='\\]\n' '/account =/{$0 = $0 " " sq "Michael" sq "," ORS } 
    {printf $0 RT}' file 

$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
    'Michael', 
] 

$password = [ 
    'aokroae', 
    '43t03it0i0i', 
    '430it935ti', 
] 
1
# Variable assignation for generic use 
Section="account" 
Value="NewUser" 

# value integration in section 
sed " 
# filter to only good section (just print for others) 
/^[$]${Section} = \\[/,/]/ !b 

# To add at begin 
    /^[$]${Section} = \\[/ a\\ 
    '${Value}' 
# To add at the end 
    /]/ i\\ 
    '${Value}' 

    " YourFile 
  • 選擇代碼的一部分,如果你喜歡在開頭或段的結束(註釋2以下行或刪除他們)
  • 相同的代碼添加在不同的部分
  • 別忘了值是一個正則表達式的值
  • 它使用i\a\插入和追加一個文本行(下一行)和過濾器的選擇文本的很大一部分申請
1

最簡單的事情是保持前行,然後替換它的文本與新文本在必要的時候,所以你保留縮進:

$ awk -v srch='$account' -v add='Michael' ' 
    $1 == srch { f = 1 } 
    f && /]/ { sub(/[^\047[:space:]]+/,add,prev); print prev; f = 0 } 
    { print; prev = $0 } 
' file 
$account = [ 
    'user1', 
    'anotheruser1', 
    'companyaccount', 
    'Michael', 
] 

$password = [ 
    'aokroae', 
    '43t03it0i0i', 
    '430it935ti', 
] 

以上在任何awk的工作,總是會縮進添加文本,從而線與前行,不需要對縮進進行硬編碼。

相關問題