2011-09-17 4 views
0

私はsedを使用してファイルにファイルを追加する前に、繰り返し文字を含む文字列を削除しようとしています。 これまでは、「AA」や「22」のような連続した繰り返しで刺しゅうをしていましたが、完全な文字列の繰り返しとインクリメンタルな文字で苦労しています。sedを使用して、繰り返し文字列とインクリメンタル文字を含む文字列を削除しますか?

generic string generator | sed '/\([^A-Za-z0-9_]\|[A-Za-z0-9]\)\1\{1,\}/d' >> parsed sting to file 

また、 'ABA'のような繰り返しを含む文字列を削除したいと考えています。 「AEF」や「AFE」のような昇順または降順の文字列も含まれます。

sedの複数のパスを使用して不要な文字列を削除する方が簡単だと仮定しています。

**上記のXY問題を回避しようとすると、もう少し情報があります。 **

文字列の長さは8から64までですが、この例では8に焦点を絞っています。同時に、大文字のアルファ文字列を出力するように文字列生成を制限していましたが(AZ)。これはいくつかの理由からですが、主に私は生成されたファイルのサイズが非常に大きくなることを望ましくありません。

ストリームから 'AAAAAAAA'や 'AAAAAAAB'のような不要な出力を落とすsedの最初のパスで。この結果、ファイルは文字列 'ABABABAB'と 'ABABABAC'で始まります。

次のパスでは、ある文字から次の文字までが1の値で増減しないことを確認したいと思います。したがって、 'ABABABAB'のような文字列はドロップされますが、 'ACACACAC'はストリームを解析します。

次のパスでは、文字列全体に繰り返し文字が含まれている文字列を削除します。したがって、 'ACACACAC'のような文字列はドロップされますが、 'ACEBDFHJ'はファイルを解析します。

希望に役立ちます。

+0

申し訳ありません申し訳ありませんがあなたの問題をゾルを提供するために十分に理解していません。また、AEFがどのように昇順のstrであるかを見ることができますが、AFEがdesc strであるかどうかはわかりませんが、FEAをdescとして期待します。 str。 '...簡単に..複数のパス...'、はい間違いなく。 sed/s/B/Y/g; s/C/X/'in> out'という同じ行で処理を続けるために、1つのプロセスを使ってsed cmdsのグループをチェーンすることもできます。 。行ごとにcmds、1/s/A/Z/gを全体ファイルとして作成し、 'sed -f fixData.sed in out'のように使用することができます。 'sed -e 's/A/Z/g; s/B/Y/g ...'や 'sed -e' s/A/Zのように' -e'オプションを使う人もいるでしょう。/g '-e/s/B/Y/g' ... ' – shellter

+2

実際には、ask、perl、python、rubyの方がはるかに簡単です... –

+0

古典的な[XY問題](http:// meta。 stackexchange.com/questions/66377/what-is-the-xy-problem)ここにあります。生成しようとしている文字列のプロパティを記述してください。 (あなた自身の問題をどのように解決するのかを(難しい)と判断するのではなく)_ – sehe

答えて

2

あなたがsedで説明していることを行うには、何度も実行する必要があります。 SEDは「この文字は、この他の文字からの増分である」という概念を理解していないので、あなたはすべての可能な組み合わせを渡ってそれを実行する必要があります:降順文字については

sed '/AB/d' 
sed '/BC/d' 
sed '/CD/d' 
sed '/DE/d' 

など

、同じことを:

sed '/\(.\).*\1/d' 
01:

sed '/BA/d' 
sed '/CB/d' 

を繰り返し文字で文字列をドロップするために、あなたはこのような何かを行うことができます

generic string generator |sed '/\(.\).*\1/d'|sed /BA/d|sed /AB/d||sed /CB/d|sed /BC/d|sed /DC/d|sed /CD/d|sed /ED/d|sed /DE/d|sed /FE/d|sed /EF/d|sed /GF/d|sed /FG/d|sed /HG/d|sed /GH/d|sed /IH/d|sed /HI/d|sed /JI/d|sed /IJ/d|sed /KJ/d|sed /JK/d|sed /LK/d|sed /KL/d|sed /ML/d|sed /LM/d|sed /NM/d|sed /MN/d|sed /ON/d|sed /NO/d|sed /PO/d|sed /OP/d|sed /QP/d|sed /PQ/d|sed /RQ/d|sed /QR/d|sed /SR/d|sed /RS/d|sed /TS/d|sed /ST/d|sed /UT/d|sed /TU/d|sed /VU/d|sed /UV/d|sed /WV/d|sed /VW/d|sed /XW/d|sed /WX/d|sed /YX/d|sed /XY/d|sed /ZY/d|sed /YZ/d 

は、私はほんの数入力サンプルでこれをテストし、それらはすべて動作するように見えた:

トリックを行う必要があり、次の。

これはかなり不合理であり、sedよりも少し洗練された方が良いことに注意してください。以下はPythonのサンプルです:

import math 
def isvalid(x): 
    if set(len(x)) < len(x): 
    return False 
    for a in range(1, len(x)): 
    if math.fabs(ord(x[a])-ord(x[a-1])) == 1: 
     return False 
    return True 

これは、巨大なsed呼び出しセットよりもはるかに読みやすく、同じ機能を持ちます。

+0

同じ理由で私はどんな種類のスクリプトを使うことさえ考慮していませんでした。あなたは私に興味深いアイデアを与えてくれました(私にとって興味深い、おそらくここではほとんど役に立たない)。私はそのトリックをするために私の非常に錆びたc/C++を試してみるつもりです。 ありがとう! – xentoo

関連する問題