Bash

字元串操作並將其管道傳輸到 bash

  • August 1, 2020

我有一個文件,內容如下:

...
   packageEARTH {
       ...
   }
   packageMARS {
       ...
   }
   packageVENUS {
       ...
   }
...

所以我想做一個多步驟的過程。我想提取以“package”開頭的每個單詞。所以那將是:

packageEARTH
packageMARS
packageVENUS

然後在下一步中,我想將文本附加到每個單詞的前面和末尾,如下所示:

./builder makepackageEARTHMain ; ./builder makepackageMARSMain ; ./builder makepackageVENUSMain

這樣它就可以在 bash 中執行。

clean最後一步是每 30 秒後添加一個命令makepackage。所以最後它會變成:

./builder makepackageEARTHMain ; ..x30.. ; ./builder cleancache ; ..x30.. ; ./builder cleancache

這裡...x30...表示 30 次 makepackage 命令

最後將其通過管道傳輸到 bash,以便命令可以按順序執行。我對 awk 或 sed 不太熟悉,所以如果有人能幫助我了解如何解決這個問題,那將非常有幫助。

謝謝!

在每個 UNIX 機器上的任何 shell 中使用任何 awk:

$ cat tst.awk
match($0,/package[[:alnum:]_]+/) {
   sep = (cnt++ ? " ; " : "")
   printf "%s./builder make%sMain", sep, substr($0,RSTART,RLENGTH)
   if ( !(cnt % 2) ) {
       printf "%s./builder cleancache", sep
   }
}
END { print "" }


$ awk -f tst.awk file
./builder makepackageEARTHMain ; ./builder makepackageMARSMain ; ./builder cleancache ; ./builder makepackageVENUSMain

只需更改230cleancache每 30 次而不是每 2 次包裝後列印聲明。

不需要 shell 來執行命令。您可以使用以下方式完成所有perl操作:

perl -ne '
 for (/\bpackage\w+\b/g) {
   system "./builder", "make${_}Main";
   system "./builder", "cleancache" unless ++$n % 30
 }' input-file

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