- 良いgrepを使用して行末のパターンを検出するしかし、DOSファイルのCRLF行終端に使用されます。
- 絵https://unix.stackexchange.com/a/462633/374303、1つの方法はを使用することですが、
dos2unix
リモートサーバーにはありません。
つまり、拡張正規表現モードでは機能しませんか\r
? :grep
$ printf 'abcd\r\n' | grep -Ec 'd\r$'
0
$ printf 'abcd\r\n' | grep -c 'd.$'
1
$ printf 'abcd\r\n' | grep -Pc 'd\r$'
1
私の考えでは、\r
拡張正規表現の一部であるようです。
https://valelab4.ucsf.edu/svn/3rdpartypublic/boost/libs/regex/doc/html/boost_regex/syntax/basic_extended.html。いいえ?
それとも本当に限界ですかgrep
?
答え1
いいえ、\r
標準の一部ではありません。基本的な...でもない延長する以下を除く正規表現存在するawk
、一部はgrep
これを拡張としてサポートしていますが(例:ast-openやデフォルトのBREをgrep
使用)、すべての正規表現タイプをサポートしています。-E
-X
-P
perl
しかし、これはPCRE式だけでなく正規表現の一部なのでgrep
。-P
ほとんどのシェルはキャリッジリターンに拡張される$'...'
ksh93の引用符形式をサポートします。\r
したがって、これを使用して次のことができます。
grep $'d\r$'
(*LF)
PCREを(*CRLF)
使用すると、などのディレクティブを使用して行区切り文字の種類を指定できますが、PCREを使用してPerlなどの一致を実装しても使用できません(*CR)
。grep -P
grep
コンテンツ一度に1行(LFで区切られている)なので、正規表現に一致する文字列にLFが見つかりません。
pcregrep
ただし、UltralineM
モードでは使用できます。
$ printf '%s\r\n' foo abcd bar | pcregrep -M '(*CRLF)d$' | sed -n l
abcd\r$
(sed -n l
CRでマーク\r
)。
GNUを使用すると、フラグを使用して行の代わりにNULで区切られたレコードで機能させることがgrep
できます。-z
$ printf '%s\r\n' foo abcd bar | grep -oPz '(*CRLF)(?m).*d$' | tr '\0' '\n' | sed -n l
abcd$
(Ultralineフラグをレコードの終わりに加えて、各行の終わりに一致させ、出力m
に表示するためにNULをLFに解析することもできます。)$
tr