sedで行を変更しますか?

sedで行を変更しますか?
 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"

これにより線が反転します。

おすすめ記事