Shell

在 sed 中使用命令替換

  • July 7, 2021

我有一個包含許多不同標題的降價文件,我正在編寫一個 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但我無法正確理解它。任何與此相關的幫助sedawk將是有益的。

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,剩餘的行也顯示為最初不變。

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