Shell

如何從標準輸入中刪除第 n 個單詞?

  • September 3, 2022

對於給定的 N,我想創建一個腳本,從標準輸入中刪除第 N 個單詞。例如,對於這個輸入:

One two three four, five
six seven eight, nine

如果我們要求刪除第 8 個單詞,它應該刪除eight,. 就我而言,單詞是任何非空格字元序列。

One two three four, five
six seven  nine

是否有一些聰明的單線可以使用標準命令行實用程序來完成此任務?目前我有一個相當長的腳本來執行此操作,但感覺有點矯枉過正。

perl

$ perl -pe 's/\S+/++$c == 8 ? "" : $&/ge' <your-file
One two three four, five
six seven  nine
$ perl -pse 's/\S+/--$n ? $& : ""/ge' -- -n=8 <your-file
One two three four, five
six seven  nine

s或者在找到第 n個單詞後進行一些優化並且不執行替換:

perl -pse 's/\S+/--$n ? $& : ""/ge if $n > 0' -- -n=8 <your-file

使用任何 awk 而無需一次將所有輸入讀入記憶體:

$ awk -v t=8 '{p=n; n+=NF} (n>t) && !f++{$(t-p)=""} 1' file
One two three four, five
six seven  nine

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