1

「、」で区切られたフィールドの1つに1つ以上の「-」を含めることができる文字列レコードのファイルがあります。

目標は、フィールド値に3つ以上の「-」が含まれている場合にその値を削除することです。

sed / awkの過去の知識を取り戻そうとしていますが、あまり前進できません

==========

info,whitepaper,Data-Centers,yes-the-6-top-problems-in-your-data-center-lane

info,whitepaper,Data-Centers,the-evolution-center

info,whitepaper,Data-Centers,the-evolution-of-lan-technology-lanner

==========

期待される結果:

info,whitepaper,Data-Centers

info,whitepaper,Data-Centers,the-evolution-center

info,whitepaper,Data-Centers

ありがとう

4

4 に答える 4

1

試す

sed -r 's/(^|,)([^,-]+-){3,}[^,]+(,|$)/\3/g'

またはスラッシュに興味がある場合

sed 's/\(^\|,\)\([^,-]\+-\)\{3,\}[^,]\+\(,\|$\)/\3/g'

説明:

私は最も基本的なsedコマンドである置換を使用しています。構文は次のとおりですs/pattern/replacement/flags

これpattern(^|,)([^,-]+-){3,}[^,]+(,|$)replacementです\3flagsですg

gフラグはグローバル交換を意味します(最初の行だけでなく、一致するすべてのパーツが交換されます)。

pattern

  • 括弧()はグループを作成します。数学のように。また、後で番号を持つグループを参照することもできます。
  • ^$文字列の始まりと終わりを意味します。
  • |「または」を(^|,)意味するので、「カンマまたは文字列の先頭」を意味します。
  • 角かっこ[]は文字クラスを意味し、^内側は否定を意味します。つまり[^,-]、「コンマまたはハイフン以外のもの」を意味します。通常、ハイフンは文字クラスで特別な意味を持っているわけではありません[a-z]。すべて小文字を意味します。ただし、ここでは中央にないため、ハイフンにすぎません。
  • +式の後は、「1回以上一致する」ことを*意味します(0回以上一致することを意味します)。
  • {N}「正確に一致する」を意味しNます。{N,M}「からから」Nを意味しMます。{3,}「3回以上」を意味します。+はと同等{1,}です。

これで終わりです。replacementただ\3です。()これは、この場合はの3番目のグループを指し(,|$)ます。これは、置換後に残る唯一のものになります。

PS-rオプションは、エスケープする必要のある文字を変更するだけです。これがないと、。()-{}|でエスケープしない限り、すべてが通常の文字として扱われます\。逆に、リテラル (-rオプションと一致させるには、それをエスケープする必要があります。

PPSこれがのリファレンスですsedman sedあなたの友達でもあります。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-06-16T21:12:29.733 に答える
0

sedやawkの代わりにperlを試すことができます。

perl -F, -lane 'print join ",", grep { !/-.*-.*-/ } @F' < file.txt
于 2012-06-16T21:21:17.480 に答える
0
sed 's/\(^\|,\)\([^,]*-\)\{3\}[^,]*\(,\|$\)//g'

これは、より多くの場合に機能するはずです。

sed 's/,$/\n/g;s/\(^\|,\|\n\)\([^,\n]*-\)\{3\}[^,\n]*\(,\|\n\|$\)/\3/g;s/,$//;s/\n/,/g'
于 2012-06-16T21:23:55.900 に答える
0

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

sed 's/,\{,1\}[^,-]*\(-[^,]*\)\{3,\}//g file
于 2012-06-17T02:12:56.293 に答える