Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用SED删除多个文本文件的第n行-在OSX上不适用于我_Bash_Macos_Unix_Sed - Fatal编程技术网

Bash 使用SED删除多个文本文件的第n行-在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 但是,这对我来说不起作用,

为澄清而编辑

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

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

短稿:

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