1行のフィールドから値を抽出し、その値を次の行に追加します。

1行のフィールドから値を抽出し、その値を次の行に追加します。

ファイルにこの行があります。

x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

ファイルの「cmd」フィールドを次のように置き換えたいと思います。

x;x;x;x;x;x;cmd="ColumnAdded TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDropped TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y ";x;x;x;x

どうすればいいですか?

答え1

次のBashスクリプトを試してみてください。

while read ln; do
    out=`sed 's/\([^"]*\)"\([^"]*\)\(.*\)/\1"\2 || \2\3/' <<< "$ln"`
    out=`sed -e 's/lbk_addcolumn/ColumnAdded/' -e 's/lbk_dropcolumn/ColumnDropped/' <<< "$out"`
    echo "$out"
done < input.txt

input.txtあなたの行を含む

答え2

sed -r -e "s/(lbk_addcolumn.*)(\[.*\])\s*(\[.*\])/ColumnAdded \2 \3 || \1 \2 \3/g" \ 
-e "s/(lbk_dropcolumn.*)(\[.*\])\s*(\[.*\])/ColumnDropped \2 \3 || \1 \2 \3/g" input.txt

input.txtあなたのコンテンツはどこにありますか?

答え3

すべての行が醜いsed正規表現パターンの代わりに2行(6 * x; cmd = "..."; 4 * x)と同じ固定形式を持つ場合は、次の代替コマンドをファイルで実行できます。ファイル読み取りループが必要です。

重要なのは(すべての行の形式が安定している場合)、"as区切り文字を使用して行を3つの別々のフィールドに分割することです。

$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)

または:

$ a=$(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)
$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <<<"$a"

awkはas区切り文字を使用してファイル内の各行を区切ります"。空白行の場合は空白行を印刷して続行し、それ以外の場合はすべての行フィールドを希望の順序で印刷します
$0=""

最後に、sedは最初に発見されたテキストlbk_addcolumnColumnAdd

テスト:

$ cat e.txt
x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

# sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' e.txt)
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

awkのみを使用してgsub awk関数を使用しても同じ結果が得られます。

$ awk -F'"' '{if ($0=="") print $0;else {a=$2;gsub("lbk_addcolumn","ColumnAdd",$2);gsub("lbk_dropcolumn","ColumnDrop",$2);print $1"\""$2" || "a"\""$3;}}' e.txt
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

awkのより良い紹介:

    $ awk -F'"' '{
      if ($0=="") print $0;
      else {
        a=$2;
        gsub("lbk_addcolumn","ColumnAdd",$2);
        gsub("lbk_dropcolumn","ColumnDrop",$2);
        print $1"\""$2" || "a"\""$3;
           }
                 }' e.txt

関連情報