1

次のような行を含むファイルがあります

insert into table_name    (params1,params2,params3)  values (43044,'x',23547003);
insert into table_name    (params1,params2,params3)  values (43024,'y',26557003);
.....

最初の列と値のペアを削除したいと思います。つまり、これが目的の出力です。

insert into table_name    (params2,params3)  values ('x',23547003); 
insert into table_name    (params2,params3)  values ('y',26557003);

これどうやってするの?

これが私が今までやったことです

cat file_name | sed 's/params1,//g' 

これによりparams1が削除されますが、値の後の数字を削除するにはどうすればよいですか?

Tl; dr

insert into table_name (params2,params3) values (43024,'y',26557003);からに変更insert into table_name (params2,params3) values ('y',26557003);

4

5 に答える 5

2

を使用する 1 つの方法を次に示しsedます。左括弧を検出し、コンマ ( [^,]) 以外のすべてに何度でも一致し、その後にコンマが続きます。そして、この一致を左括弧に置き換えます。

sed 's/([^,]*,/(/g' file.txt

結果:

insert into table_name    (params2,params3)  values ('x',23547003);
insert into table_name    (params2,params3)  values ('y',26557003);
于 2012-10-30T04:51:20.403 に答える
2

以下を使用できます。

sed -e 's/params1,//' -e 's/values ([^,]*,/values (/'

次のトランスクリプトによると:

pax> cat infile
insert into table_name    (params1,params2,params3)  values (43044,'x',23547003);
insert into table_name    (params1,params2,params3)  values (43024,'y',26557003);

pax> sed -e 's/params1,//' -e 's/values ([^,]*,/values (/' infile
insert into table_name    (params2,params3)  values (x,23547003);
insert into table_name    (params2,params3)  values (y,26557003);

sedすでに持っている最初の引数。2 番目は、以下で構成される最初の文字列を単純に検索します。

  • 文字列"values (";
  • 0 個以上の非コンマ文字 (できるだけ多くの貪欲な一致)。と
  • コンマ。

"values ("次に、値の最初の引数を効果的に取り除くものに置き換えます。

于 2012-10-30T04:45:04.020 に答える
1

valuessedソリューションは問題ありませんが、かなり壊れやすいです(と次のコンマの間に改行がある場合を考えてみてm4ください)。

m4 -D "table_name=\`table_name'( shift( \$* ))" \
   -D "values=\`values'( shift( \$* ))" input-file
于 2012-10-30T20:18:39.640 に答える
1

sed ソリューションは、最初のパラメーターが params1 と呼ばれる場合にのみ機能します。変更すると壊れる...代わりにawkを使用することをお勧めします。awk は、この種のことを理解します。次のように列を分割できます。

猫ファイル | awk '{print $n}' (n は 1、2 3 などのフィールド番号)

その後、必要に応じて sed を実行できますが、これを使用してコンマ区切りの値を分割することをお勧めします。

for i in `cat file`; do
  thing=echo $i
  old=$(echo $thing | awk '{print $4}') #This should get you (43044,'x',23547003)
  new=$(echo "\($(echo $old | cut -d \, -f 2)\,$(echo $old | cut -d \, -f 3)\)") 

  #then just replace old with new... 
done
于 2012-10-30T05:02:55.657 に答える
1

@paxdiabloの答えは完全に正しいですが、insert行のいずれかがtable_name. その場合は、次のような小さな sed スクリプトを検討してください。

# fixup.sed
/^insert into table_name/{
    s/params1,//
    s/values ([^,]*,/values (/
}

上記の 2 つのs///コマンドは、 で始まる行でのみ実行されますinsert into table_name。このスクリプトを次のように適用します。

$ sed -f fixup.sed < input > output
于 2012-10-30T06:30:18.093 に答える