Unix Bash阻止sed合并行?
我对unix完全陌生,我正在尝试找出如何从文件目录中删除包含部分字符串的行。我已经设法从我读到的内容中拼凑出一个脚本,但问题是它合并了行,并且没有保留回车符 命令: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
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/*,但仍然有相同的输出。我需要把线路分开。