Bash 使用SED删除多个文本文件的第n行-在OSX上不适用于我
为澄清而编辑 感谢@KamilCuk、@Jetchisel和@chepner以一种有意义的方式解释了这一点 首先,为任何不必要的事情道歉。我不是编码员。我目前正在使用OSX 10.14.6和OSX标准终端 短稿:Bash 使用SED删除多个文本文件的第n行-在OSX上不适用于我,bash,macos,unix,sed,Bash,Macos,Unix,Sed,为澄清而编辑 感谢@KamilCuk、@Jetchisel和@chepner以一种有意义的方式解释了这一点 首先,为任何不必要的事情道歉。我不是编码员。我目前正在使用OSX 10.14.6和OSX标准终端 短稿: sed '5d' *.txt 不是删除目录中每个文本文件的第5行 背景 我有数千篇纯文本新闻文章,我将用它们进行语料库分析。因此,我想从文件中删除不相关的文本信息 文章均采用以下格式(为清晰起见添加行号): 因此,就我而言: sed '5d' *.txt 但是,这对我来说不起作用,
sed '5d' *.txt
不是删除目录中每个文本文件的第5行
背景
我有数千篇纯文本新闻文章,我将用它们进行语料库分析。因此,我想从文件中删除不相关的文本信息
文章均采用以下格式(为清晰起见添加行号):
因此,就我而言:
sed '5d' *.txt
但是,这对我来说不起作用,也不适用于我尝试过的任何其他变体(使用*或*.txt)
它总是删除第一个文件的第5行,但目录中的其余文件都没有删除,所以有些东西在工作
或者,当字符串“Body”是行中的唯一单词时,是否有方法指定删除该字符串
很明显,我在这里的方向是错误的,所以任何方向都是可取的。来自POSIX规范: 地址可以是一个十进制数,用于对文件中的输入行进行累计计数,也可以是一个“$”字符,用于处理最后一行输入,或者是一个上下文地址(由BRE组成,如sed中的正则表达式所述,前面和后面都有一个分隔符,通常是a) 因此,命令
5d
只删除作为一个整体的文件的第5行,但您需要每个文件的第5行
for f in *.txt; do sed -i '' '5d' "$f"; done
我看不出如何“重置”地址,因此您必须指定上下文地址
sed -i '' '/^Body$/d' *.txt
这将删除仅由单词正文组成的每一行
;^
匹配行首,$
匹配行尾
或者,只需为每个文件分别运行
sed
for f in *.txt; do sed -i '' '5d' "$f"; done
因此,您确定了一个事实:调用
sed 5d*.txt
删除了第一个文件的第5行。因此,也许可以为文件夹中的每个文件调用sed 5d
,这样每个文件都是第一个文件。这就是我有点困惑的地方:使用-e和字符串删除行,“/StringGoesher/d”对所有文件都有效。使用“NUMd”的操作方式似乎不同。sed-i'-e'/Northern Territory News(Australia)/d'*.txt
和sed-i'-e'5d'*.txt
在文件上的操作方式是否有区别?区别在于sed
的实现就像数字一样递增。因此,当打开一个新文件时,行号更大,因此第一个文件中只有一个行号5(除非第一个文件的行数少于5行)。它的工作原理类似于cat*.txt | sed 5d
。有了这样一种模式,你就不在乎行号了我不想删除带有字符串“Body”的行。
只要删除只包含单词Body而不包含其他内容的行即可。要删除的字符串Body
是否始终是行的开始/开始?@doublesupercol这有什么意义?结果应该是什么?请发布您希望从您提供的输入中获得的预期输出。为什么不只过滤两种模式之间的行Body
和Load date
而不关心其他任何事情呢?
sed -i '' '/^Body$/d' *.txt
for f in *.txt; do sed -i '' '5d' "$f"; done