改行文字を次のように一致させることができます\n
。
echo "one
two" | sed 'N;s/\n/_/g'
GNUでは、改行文字を除くすべての文字を一致させるsed
ことができます。[^\n]
echo "one
two" | sed 'N;s/[^\n]/_/g'
これは非常に便利ですが、POSIXに違反します。他のバージョンsed
に対する正解__n______
タブと同じですが、実際のタブ(前にctrl-v)を使用して解決できました。しかし、これは改行文字では機能しません。
echo "one
two" | sed 'N;s/[^
]/_/g'
私にしてくださいunbalanced brackets
。
[^[:cntrl:]]
一致させたい他の制御文字がない場合にのみ使用してください。
それでは、POSIXで改行を除くすべての文字を一致させる正しい方法は何ですかsed
?
答え1
ご質問を正確に理解していない可能性がありますが、ご回答いたします。
改行を除くすべての文字を一致させるには、単純な正規表現ポイントが.
正確に対応することを行います。改行文字を除くすべての文字と一致します。
Gnuではなくsedで試してみましょう。
$ cat file5
home
help
variables
compatibility
$ sed 's/./_/g' file5
____
____
_________
_____________
$ echo "one
two
three
four" |sed 's/./_/g'
___
___
_____
____
しかし、最初のsedの例は次のとおりです。
echo "one
two" | sed 'N;s/\n/_/g'
すべての新しい行ではなく、次の新しい行にのみ一致します。
$ echo "one
> two
> three
> four" |sed 'N;s/\n/_/g'
one_two
three_four
答え2
基本正規表現のPOSIX仕様リテラル改行文字の一致は許可されていません\n
(以下の強調表示):
POSIX.1-2017 のシェルボリュームとユーティリティボリュームは、
<newline>
正規表現を使用する標準ユーティリティの別の説明で文字一致を許可するかどうかを指定します。<newline>
特に指定しない限り、パターンまたは一致テキストにリテラル文字または同等のエスケープシーケンスを使用すると、未定義の結果が生成されます。。
幸いなことに、sed
ユーティリティ仕様別の言及がある場合は、次のテキストを含めます。
ユーティリティ
sed
は、XBDの基本正規表現で説明されているように、以下を追加してBREをサポートする必要があります。[...]
- エスケープシーケンスはパターン空間の埋め込みと一致する
\n
必要があります。<newline>
[...]
これにより、パターン空間を含む正規表現で使用されるリテラル改行文字を一致させることができます(egを使用)sed
。N
\n
[^\n]
これにより、改行文字ではなく単一文字と一致するために使用できると信じられました。これはsed
、GNUシステム、OpenBSD、FreeBSD、およびPlan 9の実装でも行われます。
答え3
実際、この状況を一般的な方法で処理する非常にきれいな方法がありますsed
。改行文字を一般文字(_)などに置き換えてから、[^_]を実行して返します。もともとは発生した問題に対する解決策を投稿したかったのですが、投稿するのが面倒でしたが、今はここに投稿します。
sed -e '
/./!b
:loop
$q; N
/\n$/bloop
h
/\ncreate table/!{
s/\(.*\)\n.*/\1/p
g;s/.*\(\n\)/\1/;D
}
g
y/\n_/_\n/
s/^[^_]*/test/
y/\n_/_\n/
' input.data
答え4
[[:alnum:][:punct:][:blank:]]
角かっこ式を使用できます。
echo "one
two" | sed 'N;s/[[:alnum:][:punct:][:blank:]]/_/g'
出力:
___
___
[:alnum:]
すべての英数字、[:punct:]
すべての句読点、および[:blank:]
すべての水平スペースに一致します。すべての垂直スペースは無視され、一致しません。
よりオンラインsed
デモ。