我想创建一个脚本,对于给定的 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,他发布了这篇文章作为评论到另一个答案。