繁体   English   中英

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

[英]Deleting nth line of multiple text files with SED - not working for me on OSX

为澄清而编辑

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

首先,为任何菜鸟道歉。 我不是编码员。 我目前正在使用 OSX 10.14.6 和 OSX 标准终端。

短题:

sed '5d' *.txt

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

背景

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

文章均采用以下格式(为清楚起见添加了行号):

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

“Body”这个词总是出现在第 5 行,总是大写,而且总是单独出现。

我想只删除第 5 行,或者只删除本身包含“Body”一词的行(因为文章中几乎肯定会包含“Body”这个词)。

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

sed '5d' file

所以,就我而言:

sed '5d' *.txt

但是,这不适用于我,也不适用于我尝试过的任何其他变体(使用 * 或 *.txt)。

sed -i '5d' *.txt

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

sed -e '5d' *.txt

它总是删除 FIRST 文件的第 5 行,但没有删除目录中文件的 rest,所以有些东西正在工作。

或者,当它是一行中唯一的单词时,有没有办法指定删除字符串“Body”?

很明显,我在这里有错误的一端,所以任何方向都会受到赞赏。

从 POSIX 规范:

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

所以命令5d只删除整个文件的第 5 行,但你想要每个文件的第 5 行。

反正我看不到“重置”地址,所以你必须指定一个上下文地址。

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

这将删除仅包含单词Body的每一行; ^匹配行首, $匹配行尾。


或者,只需为每个文件单独运行sed

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM