如何从标准输入中删除第n个单词?

如何从标准输入中删除第n个单词?

我想创建一个脚本,对于给定的 N,从标准输入中删除第 N 个单词。例如,对于此输入:

One two three four, five
six seven eight, nine

如果我们要求删除第8个单词,则应该删除eight,.就我的目的而言,单词是任何非空格字符序列。

One two three four, five
six seven  nine

是否有一些聪明的单行代码可以使用标准命令行实用程序来完成此任务?目前我有一个相当长的脚本来做到这一点,但感觉有点矫枉过正。

答案1

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

答案2

使用任何 awk 并且不一次将所有输入读取到内存中:

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

答案3

使用GNUsed

$ sed -Ez 's/(([^ \n]*( |\n)){7})[^ ]*/\1/' input_file
One two three four, five
six seven  nine

答案4

该解决方案使用 GNU sed 的-z功能,它将整个文件读取为“单行”

sed -Ez 's/\S+//8'

或者,也删除该单词后面的空格

sed -Ez 's/\S+ *//8'

感谢 Ed Morton,他发布了这篇文章作为评论到另一个答案。

相关内容