1

この表現を機能させようとして、誰かがそれを見て、私がどれだけ離れているか教えてもらえますか?

1行目の情報を取得して、他の空白行に伝播しようとしています。

Line 1 = "1234, type"
Line 2..99 = ", type"

結果:1行目。=「1234、タイプ」

これが表現です

sed -i -R -n '{(^[^,]{});x;n;^,;s/^.{}/\1/;x;p;x;p}' SedExit.txt > Str.txt
4

3 に答える 3

5

あなたがベースの解決策に興味があり、awk上記の私のコメントであなたの要求の私の解釈が正しいと仮定する場合に備えて:

awk -F, 'BEGIN { OFS = "," } $1 { last = $1 } !$1 { $1 = last } { print }' SedExit.txt 

編集:簡単な説明-

-F,入力フィールドの区切り文字としてコンマを使用するようにawkに指示します。自動的にカンマで行を分割し、個々のフィールドを$ 1、$ 2などとして使用できるようにします($ 0は行全体です)

BEGIN {code}は、入力が処理される前に、awk実行の開始時に1回中かっこでコードを実行します。

OFS = ","入力と一致するように、出力フィールドの区切り文字をコンマに設定します。これにより、コード内の行全体を再構築する代わりに、フィールドを直接変更しても、コンマで区切られた出力を取得できます。

残りのコードは、入力の1行ごとに1回実行されます。

$1 { last = $1 } 1つ目$1は、次のコードブロックを実行するために満たす必要のある条件です。現在の行のそのフィールドがtrue(空でない)の場合、ブロックが実行されます。ブロックは、そのフィールドのコピーを`last'という新しい変数に保存します。

したがって、最初のコンマの前に何かがある場合は、後で使用できるように覚えています。

!$1 { $1 = last } ここでの条件は無効になるため、このブロックは最初のフィールドが空の場合にのみ実行されます。その場合、逆の方法でコピーし、最初のフィールドをの値に設定しますlast。うまくいけば、最初のブロックに一致しlastて何かに設定された行を以前に見たことがあるか、これは役に立ちません。

{ print } ここには条件がないため、コードはすべての行で実行され、出力されるだけです。該当する場合、出力には$1への変更が組み込まれます。

于 2012-06-14T02:35:15.737 に答える
1

問題文

できればsedを使用して、最初の行の最初のフィールドを後続の各行の最初のフィールドにコピーします。

解決

最初のフィールドを変数に格納してから、行範囲でsed式を実行します。

FIELD1=$(head -n1 /tmp/foo | cut -d, -f1)
sed "2,$ s/^.*,/$FIELD1,/" /tmp/foo
于 2012-06-14T03:18:54.530 に答える
1

これはあなたのために働くかもしれません:

sed '/^,/!{h;b};G;s/\(.*\)\n\([^,]*\).*/\2\1/' file

説明:

  • 行がコンマで始まらない場合は、その行をホールドスペース(HS)に保存し、中断します。つまり、それ以上の処理は行わず、行を印刷します。/^,/!{h;b}
  • 行がコンマで始まる場合は、改行とHSの内容をパターンスペース(PS)に追加します。G
  • HSにあった最初のフィールドの最初のコンマまでを現在の行の前に追加し、他のすべての余りを削除します。s/\(.*\)\n\([^,]*\).*/\2\1/
于 2012-06-14T21:03:11.550 に答える