4

次のようなテキストがあるとします。

  foobar 42                  | ff 00 00 00 00
  foobaz 00                  | 0a 00 0b 00 00
  foobie 00                  | 00 00 00 00 00
  bar    00                  | ab ba 00 cd 00

00の右側にないすべて|を でラップするように変更したいが、 has()の LHS にある場合に限る。望ましい結果:|00

  foobar 42                  | ff 00 00 00 00
  foobaz 00                  | (0a) 00 (0b) 00 00
  foobie 00                  | 00 00 00 00 00
  bar    00                  | (ab) (ba) 00 (cd) 00

sed を使用してこれを行う良い方法はありますか、それとも言語の機能を超えて拡張しようとしていますか?

これまでの私の仕事は次のとおりです。

s/[^0]\{2\}/(&)/gRHS値をラップします

/[^|]*00[^|]*|/コマンドへのアドレスとして使用して、有効な行のみを操作できます

ここでのコツは、パターン スペースの一部で実行するコマンドを定式化することです。

これは実際には行指向ではないため、機能する表現を得るのに苦労している理由が説明できるかもしれません.

4

5 に答える 5

4
$ awk 'BEGIN{ FS=OFS="|" } $1~/ 00 /{gsub(/[^ ][^0 ]|[^0 ][^ ]/,"(&)",$2)} 1' file
  foobar 42                  | ff 00 00 00 00
  foobaz 00                  | (0a) 00 (0b) 00 00
  foobie 00                  | 00 00 00 00 00
  bar    00                  | (ab) (ba) 00 (cd) 00

検索したい文字列が 2 つの 0 よりも複雑になった場合、文字列を否定する正規表現を書く必要がないため、より一般的に拡張可能なアプローチを次に示します。

$ awk '
    BEGIN{ FS=OFS="|" }
    $1 ~ / 00 /{
        split($2,a,/ /)
        $2=""
        for (i=2;i in a;i++)
            $2 = $2 " " (a[i] == "00" ? a[i] : "(" a[i] ")")
    }
    1
' file
  foobar 42                  | ff 00 00 00 00
  foobaz 00                  | (0a) 00 (0b) 00 00
  foobie 00                  | 00 00 00 00 00
  bar    00                  | (ab) (ba) 00 (cd) 00
于 2013-08-20T02:34:00.510 に答える
3

これはうまくいくかもしれません(GNU sed):

 sed -r '/^\s*\S+\s*00/!b;s/\b([^0][^0]|0[^0]|[^0]0)\b/(&)/g' file

これは、単語の後に 00 が続く行で始まらない行を無視します。次に、0 ではないか、0 と 0 以外を含む 2 つの文字列を括弧で囲んで挿入します。

于 2013-08-20T07:28:44.107 に答える
1

これを試してみてください!

$ sed '/00 *|/ { h; s/|.*/|/; x; s/.*|//; s/\(0[1-9a-f]\|[1-9a-f][0-9a-f]\)/(\1)/g; H; x; s/\n//; }' yourfile.txt

私が得る出力はこれです:

foobar 42                  | ff 00 00 00 00
foobaz 00                  | (0a) 00 (0b) 00 00
foobie 00                  | 00 00 00 00 00
bar    00                  | (ab) (ba) 00 (cd) 00

編集されたので00|.

于 2013-08-20T02:27:29.727 に答える