2017-05-08 90 views
2

我正在編寫一個bash腳本來安裝Phoenix應用程序。我想添加依賴到我的配置文件的deps部分而不依賴行號。找到給定字符串後的第一個字符

31 # Type `mix help deps` for examples and options. 
32 defp deps do 
33 [{:phoenix, "~> 1.2.1"}, 
34  {:phoenix_pubsub, "~> 1.0"}, 
35  {:phoenix_ecto, "~> 3.0"}, 
36  {:postgrex, ">= 0.0.0"}, 
37  {:phoenix_html, "~> 2.6"}, 
38  {:phoenix_live_reload, "~> 1.0", only: :dev}, 
39  {:gettext, "~> 0.11"}, 
40  {:cowboy, "~> 1.0"}] 
41 end 

在這種情況下,我想打開]在管線40到逗號,並插入{:foo, "~> 1.0"}]下面線40我假設你可以在SED或AWK表達式中使用defp deps do作爲標記,然後定位後面的第一個]

這樣做的最好方法是什麼?

+1

燁,你必須先從邏輯......這裏的有些東西可以幫助你嘗試命令https:// stackoverflow。com/questions/38972736/how-to-select-lines-between-two-patterns然後詢問你是否被卡住 – Sundeep

+0

@Sundeep事實證明,這是配置文件中唯一出現的模式'}]存在,所以一個簡單的'sed'沒有看看周圍的作品。但是,這超出了我原來的問題和意圖。 @sat有一個可靠的答案(儘管一個用於GNU sed,OSX sed是不同的)...如果你能在awk中提供更通用的解決方案,我會將其標記爲正確的。 –

回答

3

您可以使用此sed

sed '/^defp deps do/{:loop; /]$/{s/]$/,\n {:foo, "~> 1.0"}]/g;b}; n; b loop;}' file 

測試:

$ sed '/^defp deps do/{:loop; /]$/{s/]$/,\n {:foo, "~> 1.0"}]/g;b}; n; b loop;}' file 
# Type `mix help deps` for examples and options. 
defp deps do 
    [{:phoenix, "~> 1.2.1"}, 
    {:phoenix_pubsub, "~> 1.0"}, 
    {:phoenix_ecto, "~> 3.0"}, 
    {:postgrex, ">= 0.0.0"}, 
    {:phoenix_html, "~> 2.6"}, 
    {:phoenix_live_reload, "~> 1.0", only: :dev}, 
    {:gettext, "~> 0.11"}, 
    {:cowboy, "~> 1.0"}, 
    {:foo, "~> 1.0"}] 
end 

更新:(對於OSX

  1. 將此保存到file.sed
#!/bin/sed 
/^defp deps do/ { 
    :loop 
    /]$/ { 
     s/]$/,\n {:foo, "~> 1.0"}]/g 
     b 
    } 
    n 
    b loop 
} 
  • 像這樣運行

    $ sed -f file.sed inputfile.txt 
    
  • +0

    我喜歡這裏的邏輯。儘管我一直收到這個錯誤:'sed:1:「/^defp deps do/{:loop; ...」:意外的EOF(正在等待)')。 –

    +0

    @MarkKaravan,試試這個:'sed'/^defp deps do/{:loop; /] $/{s /] $ /,\ n {:foo,「〜> 1.0」}]/g; b;}; N; b loop;}'file' – sat

    +0

    同樣的錯誤...也許它是一個版本的東西?我在'OS X 10.11.6'上使用'#/ bin/bash' ...不幸的是,它不會讓我檢查sed的版本 –

    1

    我會用這個命令去:

    sed -i config.txt -e 's/\({:cowboy.*\)\]/\1,\n {:foo, "~> 1.0"}]/g' 
    

    說明:

    • sed -i <filename>編輯就地文件。在你運行這個之前,你可以試試cat filename | sed ...只是爲了確保你做你想做的事情。
    • sed -e ...運行表達式
    • s/.../.../g是sed中的替換運算符。它將第一對斜槓中的東西替換爲第二對斜槓中的其他東西。
    • /\(:cowboy.*\)\] - 它匹配包含{:cowboy並以]結尾的行。它捕捉所有內容,除了右括號]。我希望這隻匹配第40行。我不知道你的完整文件。
    • 替換\1,\n {:foo, "~> 1.0"}]首先用\1打印捕獲的部分。然後添加新行,必要空格,新配置和括號。即正是你在這裏看到的。
    +0

    有用並完成工作。儘管如此,我想要一些不依賴於最後依賴的東西。此外,它似乎像OSX(我正在使用)實現sed與其他系統不同......我的版本看起來像這樣: 'sed -i''s/\({:cowboy。* \)\]/\ 1,\ {:foo,「〜> 1.0」}]/g'config.txt' ....(在評論中看不到,但它是一個正確的換行符,而不是\ n) –

    相關問題