echo 1234 | sed '
/\n/ !G
s/\(.\)\(.*\n\)/&\2\1/
//D
s/.//
'
上記のコードを理解できませんsed
。
私の理解は次のとおりです
PATTERN SPACE=1234
first operation /\n/ !G ---> 1234\n(if \n is not found it is appended at th end)
s/\(.\)\(.*\n\)/&\2\1/ ----> 1234\n234\n1
//D ----> \n234\n1(deletes upto newline and commands
from the beginning are applied to the
existing pattern space)
PATTERN SPACE=\n234\n1
second operation /\n/ !G ---> skipped since \n234\n1 has newline now
s/\(.\)\(.*\n\)/&\2\1/ ----> \n234\n1234\n
//D ----> \n234\n1234\n
私は何かが間違っているようです。
ベストアンサー1
このコードにはループがあり、混乱しているようです。この時点で:
s/\(.\)\(.*\n\)/&\2\1/
//D
繰り返し繰り返しながら、文字が残るまで文字を移動し、234\n1
ループを終了します。34\n21
\n4321
catonmatの説明が正しいので、ここに入力します。37.行を逆に置き換えます(「rev」Unixコマンドをエミュレートします)。。
抜粋
改行文字がない場合は、最初の行のパターン
"/\n/ !G"
空間の末尾に改行文字が追加されます。2行目は、最初の文字をにグループ化し、他のすべての文字をにグループ化する
"s/\(.\)\(.*\n\)/&\2\1/"
単純な式です。次に、一致する文字列全体をに置き換えます。ここでは、一致するフルテキスト()です。たとえば、入力文字列が「1234」の場合、式の後に続く内容は次のようになります。s///
\1
\2
"&\2\1"
"&"
"\1\2"
s///
"1234\n234\n1"
3行目はです
"//D"
。この文がこの文の中核です。空のパターンは//
最後の既存の正規表現と一致するため、次のものとまったく同じです/\(.\)\(.*\n\)/D
。 「D」コマンドは、入力の先頭から最初の改行文字まで削除し、スクリプトの最初のコマンドを使用して編集を再開します。ループを生成します。/\(.\)\(.*\n\)/
満足する限り、sedは以前のすべての操作を再開します。数回のループの後、パターン空間のテキストはになります"\n4321"
。次に/\(.\)\(.*\n\)/
失敗し、sed は次のコマンドに進みます。4行目は、
"s/.//"
パターンスペースから改行文字である最初の文字を削除します。パターン空間の内容は"4321"
- の反転になります"1234"
。これにより線が反転します。