具有某些字符数的Grep行,包括换行符

时间:2018-10-31 19:01:51

标签: linux bash shell unix sh

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

  

示例:

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

我使用grep的方式如下:

grep -E "^.{length}$"

由于两行都是相同的字符数,因此将它们打印出来,因为它不会将\ n视为字符

感谢任何想法。

2 个答案:

答案 0 :(得分:1)

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>

答案 1 :(得分:0)

假设您已将内容保存到名为file.txt的文件中,则可以尝试如下操作:

cat file.txt | awk 'length($0) > 38

仅输出长度大于38个字符的行:

"Random text with certain length\n" <br>

如果您这样做:

cat a.txt | awk 'length($0) > 37'

然后显示两行,因为它们都有37个字符...

首先不确定那是不是您想要的...还是尝试一下!