如何在文件中使用grep命令匹配"\n"字符

15
示例文件:abc.ksh
echo "This is a sample file." >> mno.txt
echo "\nThis line has new line char." >> mno.txt

我想要
echo "\nThis line has new line char." >> mno.txt

作为输出。

1
换行符决定了一行的结尾;在一行的中间不能有换行符。 - Lev Levitsky
2
转义反斜杠:grep '\\n' abc.ksh - 不用谢 :-) - Anders R. Bystrup
3
grep -F '\n' abc.ksh 也可以工作,-F 告诉 grep 将模式视为固定字符串。 - Josh Jolly
fgrep 只接受固定模式:fgrep \n mno.txt - User5910
那个echo命令含糊不清。在一些shell中,它会写入两个字符,一个反斜杠,然后是一个n;而在其他的shell中,它会写入一个真正的换行符。 - undefined
6个回答

19
使用-F来匹配固定字符串:
$ grep -F "\n" file
echo "\nThis line has new line char." >> mno.txt

man grep中:

-F, --fixed-strings

将PATTERN解释为由换行符分隔的固定字符串列表,其中任何一个都将被匹配。 (-F由POSIX指定。)


@Crusader 我需要更多的上下文信息。 - fedorqui
-zoP键有所帮助。 - Crusader
@Crusader,我还不明白你的意思,请详细说明一下。 - fedorqui

5

最简单的方法是使用正则表达式:

grep "$" filename  # this will match all lines ending with "\n" (often all lines)
grep "PATTERN$"    # this will match all lines ending with "PATTERN\n"

在正则表达式语言中,$ 表示行尾(end of line),因此它通常会匹配 "\n"(因为它很常见作为行尾)。警告:使用支持正则表达式的 grep 版本时要小心!

3

只需用另一个反斜杠转义反斜杠,并将正则表达式放在单引号中,以便shell不会处理反斜杠而将其传递给grep:

grep '\\n' abc.ksh

@Samha,请问你使用的是哪个shell和grep版本?在我的Ubuntu系统上它可以正常工作。 - Nidhin David

2

正则表达式模式搜索

grep -P '\n' mno.txt

3
另一个选项是 grep $'\n' - Velizar VESSELINOV

1

grep -zoP '[^\n]*\n[^\n]*' file

  • -z - 将所有的 \n 替换为零字节
  • -o - 仅显示差异(因为现在 grep 的整个文件都是一行)
  • -P - Perl 正则表达式

查找 \n 和前后的行


0

您可以尝试通过用另一个反斜杠转义反斜杠来实现:

grep '\\n' xyz.ksh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接