Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Unix Bash阻止sed合并行?_Bash_Unix_Sed - Fatal编程技术网

Unix Bash阻止sed合并行?

Unix Bash阻止sed合并行?,bash,unix,sed,Bash,Unix,Sed,我对unix完全陌生,我正在尝试找出如何从文件目录中删除包含部分字符串的行。我已经设法从我读到的内容中拼凑出一个脚本,但问题是它合并了行,并且没有保留回车符 命令: grep -l "apple" tmp/* -R | xargs -I'{}' sed -i '/apple/d' '{}' 1.txt applepie green blue 2.txt applepie green blue 1.txt greenblue 2.txt greenblue 文件: grep -l "ap

我对unix完全陌生,我正在尝试找出如何从文件目录中删除包含部分字符串的行。我已经设法从我读到的内容中拼凑出一个脚本,但问题是它合并了行,并且没有保留回车符

命令:

grep -l "apple" tmp/* -R | xargs -I'{}' sed -i '/apple/d' '{}'
1.txt
applepie
green
blue

2.txt
applepie
green
blue
1.txt
greenblue

2.txt
greenblue
文件:

grep -l "apple" tmp/* -R | xargs -I'{}' sed -i '/apple/d' '{}'
1.txt
applepie
green
blue

2.txt
applepie
green
blue
1.txt
greenblue

2.txt
greenblue
输出:

grep -l "apple" tmp/* -R | xargs -I'{}' sed -i '/apple/d' '{}'
1.txt
applepie
green
blue

2.txt
applepie
green
blue
1.txt
greenblue

2.txt
greenblue
我需要更改什么才能将绿色和蓝色分开?

注意:我不确定这是否有区别,但我在Windows上使用cygwin。

您只需要:

sed -i '/apple/d' textfile.txt
除非您希望输出到另一个文件,否则在添加

> newfile.txt 
最后。

您只需要:

sed -i '/apple/d' textfile.txt
除非您希望输出到另一个文件,否则在添加

> newfile.txt 

最后。

正如在评论中指出的,这可能是由于新行的处理方式。您可以使用
cat-A
打印控制字符;如果您的文件如下所示:

$ cat -A 1.txt
applepie^M$
green^M$
blue^M$
dos2unix *.txt
然后您可能有回车+换行符作为换行符(DOS/Windows样式)。或在hexdump中:

$ od -w10 -t az --endian=big -x 1.txt 0000000 a p p l e p i e cr nl >applepie..< 6170 706c 6570 6965 0d0a 0000012 g r e e n cr nl b l u >green..blu< 6772 6565 6e0d 0a62 6c75 0000024 e cr nl >e..< 650d 0a00 0000027
只有
nl
0a
)用于换行符–sed现在应该可以处理换行符了。

正如在一篇评论中指出的,这可能是由于处理换行符的方式。您可以使用
cat-A
打印控制字符;如果您的文件如下所示:

$ cat -A 1.txt
applepie^M$
green^M$
blue^M$
dos2unix *.txt
然后您可能有回车+换行符作为换行符(DOS/Windows样式)。或在hexdump中:

$ od -w10 -t az --endian=big -x 1.txt 0000000 a p p l e p i e cr nl >applepie..< 6170 706c 6570 6965 0d0a 0000012 g r e e n cr nl b l u >green..blu< 6772 6565 6e0d 0a62 6c75 0000024 e cr nl >e..< 650d 0a00 0000027
只有
nl
0a
)用于换行符–sed现在应该可以使用换行符了。

您的问题不在于命令。您问题中的命令和文件是正确的,并且确实产生了您想要的输出

您描述的问题是,在类Unix系统和基于Windows的系统之间,行尾的处理方式不同。发生这种情况可能是因为您使用了基于Windows的工具来创建文件,这为文件提供了Windows样式的行尾,而Cygwin环境中的工具希望使用类似Unix的行尾。幸运的是,您可以使用一个方便的命令将文件中的所有行尾转换为正确的类型—它被称为
dos2unix

dos2unix
将文件中的所有行尾转换为Unix/Linux类型。(如果他们已经这样做了,运行它也没什么坏处。)您可以这样使用它:

$ cat -A 1.txt
applepie^M$
green^M$
blue^M$
dos2unix *.txt
完成此操作后,文件将具有正确的行尾,并且您的原始命令应该可以工作(但Arif Burhan是正确的-您可以使用
sed-i'/apple/d'*.txt
)执行相同的操作)

如果你喜欢Cygwin,可以试试这个叫Cygwin的东西,不过要做一些幕后设置,让它更容易使用,也更有趣


快乐的黑客

您的问题不在于命令。您问题中的命令和文件是正确的,并且确实产生了您想要的输出

您描述的问题是,在类Unix系统和基于Windows的系统之间,行尾的处理方式不同。发生这种情况可能是因为您使用了基于Windows的工具来创建文件,这为文件提供了Windows样式的行尾,而Cygwin环境中的工具希望使用类似Unix的行尾。幸运的是,您可以使用一个方便的命令将文件中的所有行尾转换为正确的类型—它被称为
dos2unix

dos2unix
将文件中的所有行尾转换为Unix/Linux类型。(如果他们已经这样做了,运行它也没什么坏处。)您可以这样使用它:

$ cat -A 1.txt
applepie^M$
green^M$
blue^M$
dos2unix *.txt
完成此操作后,文件将具有正确的行尾,并且您的原始命令应该可以工作(但Arif Burhan是正确的-您可以使用
sed-i'/apple/d'*.txt
)执行相同的操作)

如果你喜欢Cygwin,可以试试这个叫Cygwin的东西,不过要做一些幕后设置,让它更容易使用,也更有趣


快乐的黑客

如果MSWIndows在某种程度上涉及1.txt和2.txt,则
dos2unix*.txt
。祝你好运。@Shelleter我不明白dos2unix合并了这些行吗?我需要将它们分开如果MSWIndows在某个时候使用了1.txt和2.txt,然后是
dos2unix*.txt
。祝你好运。@Shelleter我不明白dos2unix合并了这些行吗?我需要将它们分开。sed-I'/apple/d'tmp/*将输出到控制台,cat-tmp/*| sed-I'/apple/d'也将输出到控制台。上述两项都在tmp/目录中的每个文件上工作。我需要它检查目录中的所有文件。我尝试了sed-I'/apple/d'tmp/*,但仍然有相同的输出。我需要将这两行分开。sed-I'/apple/d'tmp/*将输出到控制台,cat-tmp/*| sed-I'/apple/d'也将输出到控制台。上述两行对tmp/目录中的每个文件都起作用。我需要它检查目录中的所有文件。我尝试了sed-I'/apple/d'tmp/*,但仍然有相同的输出。我需要把线路分开。