TL; DR
Для меня самый простой способ получить предлагаемые результаты - заменить символы новой строки на sed, прежде чем отправлять в grep (т.е. свернуть). Затем разверните при необходимости.
$ 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
"
Спасибо за разъяснение описания. Часть из того, что следует, была со ссылкой на предыдущее описание, но, кажется, это пустая трата ...
Я не уверен, что полностью понимаю и сделал некоторые предположения.
- Все строки имеют двойные кавычки или, по крайней мере, что-то уникальное, чтобы складывать / разворачивать строки, которые вы хотите считать.
- Либо CR + LF, либо только LF - это то, что считается «новой строкой / переводом строки»
- В описании \ 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>