この表現を機能させようとして、誰かがそれを見て、私がどれだけ離れているか教えてもらえますか?
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
あなたがベースの解決策に興味があり、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への変更が組み込まれます。
できればsedを使用して、最初の行の最初のフィールドを後続の各行の最初のフィールドにコピーします。
最初のフィールドを変数に格納してから、行範囲でsed式を実行します。
FIELD1=$(head -n1 /tmp/foo | cut -d, -f1)
sed "2,$ s/^.*,/$FIELD1,/" /tmp/foo
これはあなたのために働くかもしれません:
sed '/^,/!{h;b};G;s/\(.*\)\n\([^,]*\).*/\2\1/' file
説明:
/^,/!{h;b}
G
s/\(.*\)\n\([^,]*\).*/\2\1/