Shell-Script

如何使用命令行工具替換多行單引號內的文本?

  • August 30, 2019

我有一個腳本,其中$variable儲存了行數不確定的文本。假設我已經命名它script.bash並且它位於$HOME

#!/bin/bash

# commands on the beginning of my script

variable='Lorem Ipsum is simply dummied 
text of the printing and 
typesetting industry. Lorem Ipsum has been the
industry standard dummy text ever since the 1500s'

# commands at the end of my script

我想創建一個新腳本來更改variableon中的文本script.bash。程式碼的想法是這樣的:

#!/bin/bash

file="$HOME/script.bash"
mynewvariable='one
two
three'

substitute_everything_inside_variable () {
   # code
}

substitute_everything_inside_variable "$mynewvariable" "$file"

只要它只有一行,它就可以用新的一行替換整行,sed如下所示:

sed -i "5s/.*/$mynewvariable/" "$HOME/script.bash" 

但是考慮到我需要替換單引號內的所有內容(並且其中的文本行數是可變的),我不知道如何使用命令行工具來做到這一點。有沒有辦法在不閱讀和解釋每一行發生的事情的情況下做到這一點?

替換文件的全部內容比更改包含許多您不想破壞的其他內容的文件中的多行引號字元串要容易得多。

嘗試將 的內容$variable放入文件(例如vfile.txt),並讓您的 shell 腳本執行類似variable="$(cat vfile.txt)".

然後,您可以使用任何您想要替換或修改的方法vfile.txt

Sed 具有除s. 您可以查找起始行,刪除所有行直到值的最後一部分,然後插入新值。但是,要正確引用是很棘手的-請注意,s/…/$mynewvariable/不僅換行符失敗,而且',\/. 在 Perl 中更容易做到這一點。

如果文件不是太大而無法放入記憶體,請告訴 Perl 讀取整個文件,而不是逐行分解。未經測試。

mynewvariable=$mynewvariable perl -0777 -i -p -e '
   $replacement = $ENV{mynewvariable};
   $replacement =~ s/\x27/\x27\\\x27\x27/g;
   s/^variable=\x27(?:[^\x27]|\x27\\\x27\x27)*\x27/$replacement/;
' "HOME/script.bash"

說明:

  • perl -0777 -i -p對文件內容執行 Perl 程序,然後替換文件。-0777意味著一次性處理整個文件,而不是逐行處理。
  • 我通過環境傳遞變數,因為將它拼接到 Perl 程序中會導致它被解釋為 Perl 程式碼而不是字元串(這與為什麼sed s/…/$mynewvariable/不起作用的原因相同)。
  • \x27是單引號(我把 Perl 程式碼放在單引號內,所以我不能在裡面使用單引號)。
  • $replacement =~ …替換代表單引號外殼字元串文字內部'的值。'\''``'
  • (?:[^\x27]|\x27\\\x27\x27)匹配任何一個'\''或任何不是'.

引用自:https://unix.stackexchange.com/questions/538152