[英]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.