在 sed 中使用命令替換
我有一個包含許多不同標題的降價文件,我正在編寫一個 CI 腳本,每次推送到 repo 時都會修改其中一個部分。我的 README.md 如下,
README.md
# Title ....some text... ## Heading 1 ...some text... ## Heading 2 ...some text.... ## Structure <pre> ┬ ├ first-dir ┬ first-sub-dir ├ second-dir ┬ second-sub-dir-1 ├ second-sub-dir-2 </pre> ## Heading 3 ...some text....
我想使用 sed 使用
Structure
命令的輸出來修改該部分。tree -d -L 2 -n
我嘗試使用var=$(tree -d -L 2 -n) sed -i -E "s/## Structure\n<pre>\n(.|\n)*?<\/pre>/## Structure\n<pre>\n ${var} \n<\/pre>/g" README.md
但它不能正常工作。我閱讀了有關命令替換的內容,
sed
但我無法正確理解它。任何與此相關的幫助sed
或awk
將是有益的。
awk ' /^<\/pre>$/ {flag=0} /^## Structure$/ {print; getline; print system("tree -d -L 2 -n") flag=1} !flag' <<<$(<file) >file
<<<$(<file) >file
- 一種自定義緩衝區(不適用於所有外殼)。可以用臨時文件替換:file >tmp
一個更複雜的方式,我舉個例子:
sed -i '/^## Structure/!b N;h :1;N /<\/pre>$/!b1 s/.*\n// x;p s/.*/tree -d -L 2 -n/e G' file
/^## Structure/!b
- 所有與模式不匹配的行都被腳本忽略。並且顯示不變。一旦遇到模式,以下腳本就會開始執行。
N
- 將下一行輸入附加到模式空間(工作緩衝區)中。結果,我們有 -## Structure\n<pre>
h
- 複製模式空間來保存空間(備用緩衝區)。
:1
- 為跳躍做一個標記。
N
- 追加下一行。我們進入工作緩衝區 -## Structure\n<pre>\n┬
/<\/pre>$/!b1
- 如果工作緩衝區中的行尾與模式不匹配,那麼我們返回標籤:1
並在每個循環中添加下一行,直到</pre>
添加行。
s/.*\n//
- 然後我們刪除工作緩衝區中除最後一行之外的所有內容</pre>
。
x
- 我們在它們之間更改緩衝區的內容,以便該行出現在工作緩衝區中 -## Structure\n<pre>
。在備用緩衝區中有一行——</pre>
p
列印工作緩衝區## Structure\n<pre>
s/.*/tree -d -L 2 -n/e
的內容——我們用shell命令替換緩衝區的內容並執行它。
G
- 將</pre>
備用緩衝區的內容附加到工作緩衝區 - 附加到輸出 shell 命令。列印內容並且作業返回到腳本的開頭。之後的下一行</pre>
被讀入工作緩衝區。並且由於文件匹配 pattern 中沒有更多的行/^## Structure/!b
,剩餘的行也顯示為最初不變。