1

以下の分岐に関する SED チュートリアルで示されている例と同じ出力を取得できません 。 http://www.grymoire.com/Unix/Sed.html#uh-59

ここでコードを引用:

#!/bin/sh
sed '
:again
    s/([ ^I]*)//
    t again
'

このフィルターの後、スペースはまだ括弧内にあります。

[更新] ここに私の出力があります:

$echo "( ( test ) )" | sed '
> :again
>      s/([ ]*)//
>      t again
> '
( ( test ) )
$

そうではない((test))でしょうか?著者が示したように、ネストされた括弧内の空白を削除するスクリプトを取得するにはどうすればよいですか?

[/アップデート]

[更新2]

$echo " ( ( ) ) " | sed '
> :again
> s/\([ ]*\)//
> t again
> '

プロンプトが戻っていません。

[/UPDATE2]

また、「^I」文字を入力するにはどうすればよいですか? 水平タブだと思いますが、puTTY を介して他の制御文字のようにキー入力することはできません (たとえば、「Enter」を取得するには、「Ctrl-V」に続いて「Enter」キーを入力しますが、これはそうではありませんタブでは機能しません)。[ ]*スペースのみ(の代わりに正規表現を使用)で試しまし[ ^I]*たが、これも機能しませんでした。

4

2 に答える 2

2

いくつかのチュートリアルで作業するためのいじめ。

viを使用している、またはグループ内にvim タブ文字を含める必要があると仮定すると、タブキーを入力するだけです。(私は常にパテを使用していますが、タブ文字を押してもタブ文字がドキュメント/コマンドラインに「挿入」されない場合は、パテの構成に問題があります)。[ .. ]

^Ivilistモードのものです。Listモードは、改行文字 (\n) が正規表現文字として表示される場所を確認するのに便利です (正規$表現では「行末アンカー」であり、もう一方は^文字 (行頭) です)。 .

viリストモードをオンにする:liと、すべてのタブ文字が として展開され^I、すべての行末がとして表示されます。$

あなたが言うように

示されているように、ネストされた括弧内の空白を削除するスクリプトを取得するにはどうすればよいですか

新しい sed は単純な括弧をグループ化文字として使用して\1、s/pat/repl/ 置換コマンドの置換側のように置換グループを作成するため、これは少しあいまいです。

あなたの例の置換側に番号付き置換値がないことを考えると、目的はリテラル()ペアを削除することであり、それが示されているように機能するはずであると仮定します。:set list内にタブ文字を追加すると、[ ... ]動作するはずです。そうでない場合は、表示される可能性のあるエラー メッセージで質問を編集してください。

これが役立つことを願っています。

于 2012-11-26T14:53:49.530 に答える
1

( test ) 正規表現と一致しません([ ]*)([ ]*)ペア内にスペースしか含まれていない文字列にのみ一致します。([ ]*おそらく、内部の先頭のスペース[ ]*)を削除し、末尾のスペースを削除することを探しています。

于 2012-11-26T15:15:48.600 に答える