使用SED删除多个文本文件的第n行-在OSX上不适用



为澄清而编辑

感谢@KamilCuk、@Jetchill和@chepner以一种有意义的方式解释

首先,对任何失误表示歉意。我不是一个程序员。我目前正在使用OSX 10.14.6和OSX标准终端。

短期问题:

sed '5d' *.txt

不是删除目录中每个文本文件的第5行。

背景

我有成千上万的纯文本新闻文章,我将用它们来进行语料库分析。因此,我想从文件中删除不相关的文本信息。

文章都采用以下格式(为了清晰起见,添加了行号(:

1. <blank line>
2. <article heading>
3. <date> 
4. <blank line>
5. Body

单词";身体;总是出现在第5行,总是大写,并且总是自己。

我只想去掉第5行,或者只去掉具有单词"1"的行;身体;其本身(因为文章中几乎肯定会包含"身体"一词(。

通过阅读大量页面,以下内容应该有效:

sed '5d' file

所以,就我而言:

sed '5d' *.txt

然而,这对我不起作用,也不适用于我尝试过的任何其他变体(使用*或*.txt(

sed -i '5d' *.txt
sed -i '' '5d' *.txt
sed -e '5d' *.txt

它总是删除第一个文件的第5行,但没有删除目录中的其他文件,所以有一些工作正在进行。

或者,是否有一种方法指定删除字符串";身体;当它是一行中唯一的单词时?

很明显,我有错误的一端在这里,所以任何方向都将不胜感激。

来自POSIX规范:

地址是一个十进制数,用于对文件中的输入行进行累积计数,是一个对输入的最后一行进行寻址的"$"字符,或者是一个上下文地址(如sed中正则表达式中所述,由BRE组成,前后有分隔符,通常为a(。

因此,命令5d只删除作为一个整体的文件的第5行,但您希望每个文件都有第5行。

我无论如何都不认为";重置";地址,所以您必须指定一个上下文地址。

sed -i '' '/^Body$/d' *.txt

这将删除仅由单词Body组成的每一行;CCD_ 3匹配一行的开头,CCD_。


或者,只需为每个文件分别运行sed

for f in *.txt; do sed -i '' '5d' "$f"; done

最新更新