2

sed を使用して複数のファイルの多くの行を置き換えていますが、問題が発生しました。配列を使用して sed に多くのコマンドを与えますが、検索にいくつかのスペースを含めて、sed フォームの検出と削除が多すぎる行を防ぐ必要があります。コード:

( IFS='|'; sed -rie "/  ${points_r[*]};/d" io_points.dat4; )

2 つのスペースと「;」削除する必要のない行を削除しないようにするためです。これらの行は削除されたので、これも試しました:

( IFS='|'; sed -rie "/\s\{2,\}${points_r[*]};/d" io_points.dat4; )

私の bash バージョンは 3.2.25 で、sed バージョンは 4.1.5 です。この配列を使用して一致を検索するにはどうすればよいですか?ただし、検索にスペース (および「;」) を含めますか? どんな助けでも大歓迎です!

編集:サンプル入力

  2;  14; 1;I;   0;  1;  0;  66
  3;  14; 1;I;   0;  1;  0;  141
  4;  14; 1;I;   0;  1;  0;  23
  5;  14; 1;I;   0;  1;  0;  26
  7;  14; 1;I;   0;  1;  0;   0

points_r には 3 4 と 5 の数字が含まれています。3 を含む行を削除する必要があります。4; そして5; (最初の列) 2 ではありません。または7; (2 列目に 4 が含まれています)

出力は次のようになります。

2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0
4

3 に答える 3

2

要件を誤解していない限り、次のようにします。

$ awk '/^[27];/' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

またはsed

$ sed '/^[27];/!d' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

実際、これがあなたが望む場合grep

$ grep '^[27];' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0
于 2013-08-21T13:48:27.680 に答える
1

素晴らしい脚本!

問題は、パイプの使用と、配列変数の使用にあります。

3.2 シェルでは、これらの展開が少し異なります。

sed コマンドで配列の拡張を行う必要がないように、配列を別の変数に割り当てます (必要ないかもしれませんが、作業が簡単になります)。

arr=$points_r[*]

ここで、「arr」変数でシェル置換を実行して、パイプを取得します。

arr2="${arr// /|}"

それからあなたが持っているものを使ってください、それはクールです。

私のシェルプロンプトは ">>> " で、これが機能する前に IFS と OFS の設定を解除しました。どういうわけかそれらはパイプでした....

>>> x="${points_r[*]}"
>>> echo $x
3 4 5
>>> y="${x// /|}"
>>> echo $y
3|4|5

$y を指定して sed コマンドを実行します。

( IFS は sed に渡されないと思います。 3 4 5 を受け取ります)

使用した sed 行では、正規表現を () で囲む必要があるため、1 つの一致グループ (3 または 4 または 5) になります。

sed -re "/  (${y});/d" io_points.dat4;
  2;  14; 1;I;   0;  1;  0;  66
  7;  14; 1;I;   0;  1;  0;   0

私は「i」スイッチを使用していません...

于 2013-08-22T06:59:33.883 に答える
1

値を配列にしたい場合は、このスクリプトを試してください

$ echo "${points_r[@]}"
2 3 4

$ awk -F'[ ;]+' -v p="${points_r[*]}" 'BEGIN{split(p,a," ");for (i in a) b[a[i]]=1}!($2 in b)' file
  2;  14; 1;I;   0;  1;  0;  66
  7;  14; 1;I;   0;  1;  0;   0

これは、単一の単語配列要素でのみ機能することに注意してください。

于 2013-08-21T14:09:13.473 に答える