gpt4 book ai didi

linux - Grep 具有一定字符数的行,包括换行符

转载 作者:太空宇宙 更新时间:2023-11-04 04:53:22 29 4
gpt4 key购买 nike

我只需要 grep 具有一定长度的行,但也包括换行/换行符。因此第一行将比另一行长一个字符。

Example:

"Random text with certain length\n"
"Random text with certain length"
EOF

我使用 grep 如下:

grep -E "^.{length}$"

结果打印两行,因为它们的字符数相同,因为它不将\n 计为字符

感谢您的任何想法。

最佳答案

TL;DR

对我来说,获得建议结果的最简单方法是在通过管道传输到 grep (即折叠)之前用 sed 替换换行符。然后,如有必要,展开。

$ echo -e '"Random text with certain length\n"\n"Random text with certain length"\n' | sed -e ':a;N;$!ba;s/\n"/+"/g' -e '/"+/s//"\n/g' | grep -E "^.{33}$"
"Random text with certain length"
$ echo -e '"Random text with certain length\n"\n"Random text with certain length"\n' | sed -e ':a;N;$!ba;s/\n"/+"/g' -e '/"+/s//"\n/g' | grep -E "^.{34}$"
"Random text with certain length+"
$ echo -e '"Random text with certain length\n"\n"Random text with certain length"\n' | sed -e ':a;N;$!ba;s/\n"/+"/g' -e '/"+/s//"\n/g' | grep -E "^.{34}$" | sed -e '/+"/s//\n"/g'
"Random text with certain length
"

感谢您澄清描述。下面的一些内容引用了之前的描述,但删除似乎有点浪费......

我不确定我是否完全理解并做出了一些假设。

  1. 所有行都有双引号,或者至少有一些独特的东西来折叠/展开您想要计数的换行符。
  2. CR+LF 或单独的 LF 都被视为“换行符/换行符”
  3. 在描述中,\n (LF/$) 可能表示\r (CR/^M)。这适用于对 wc 的引用。否则,grep wc不会认为这些行的长度相同。

换句话说,如上所述,默认情况下 grep 不将换行符 (\n) 计为字符,但将回车符 (\r) 计为字符,而 wc 将两者都计为字符。

这确认\n = 换行符 ($) 和\r = 回车符 (^M)

\n = 换行符

$ echo -en '\n' | wc -c
1
$ echo -en '\n' | grep -E "^.{1}" | wc -c
0

\r = 回车

$ echo -en '\r' | wc -c
1
$ echo -en '\r' | grep -E "^.{1}" | wc -c
2

对于 grep 来说,回车符是一个额外的字符。 换行符不是。

这将为两行产生相同的字符数和结果。

echo -en '\n' | sed -e '/\r/s///g' | grep -E "^.{1}" | wc -c
0
echo -en '\r' | sed -e '/\r/s///g' | grep -E "^.{1}" | wc -c
0

考虑到按行长度过滤的标准,grep -E 本身永远不会将换行符/LF 视为字符,因此无法执行此操作。另一个例子,两条线视觉上长度相同,但实际上长度不同......

$ echo -e 'hello\r\nworld\n'
hello
world
$ cat <<< "$(echo -e 'hello\r\nworld\n' | grep -E "^.{5}$")"
world
$ cat <<< "$(echo -e 'hello\r\nworld\n' | grep -E "^.{6}$")"
hello

...并将 sed 插入管道中,两行的长度相等 {5}:

$ cat <<< "$(echo -e 'hello\r\nworld\n' | sed -e '/\r/s///g' | grep -E "^.{5}$")"
hello
world
$ cat <<< "$(echo -e 'hello\r\nworld\n' | sed -e '/\r/s///g' | grep -E "^.{6}$")"
<no output>

关于linux - Grep 具有一定字符数的行,包括换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090312/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com