2017-02-23 6 views
0

私はUTF-8-BOMでエンコードされたテキストファイルを持っており、その行の先頭に6~10桁の数字が付きます。Bashは2つの6桁の数字の間の文字列を取得します

私のbashスクリプトでさらに処理するこれらの「行」(番号を含む)を取得したいと思います。

sed -n '$line\p'のforループを使うだけで簡単にできますが、残念ながらそれらの文字列の一部には改行が含まれているため、2つの6+桁の間に文字列を抽出する方法が必要です新しい行を示す数字(最初の数字を含む)。

3 "行" の例:私は必要なもの

123456\tA random string here 
123567\t another string 
this time 
it goes over 
multiple lines 
124567\t a normal string again 

123456\tA random string here 

123567\t another string 
this time 
it goes over 
multiple lines 

124567\t a normal string again 

いくつかのこと:

文字列は、残念ながら
  • は、文字列が含まれているすべての数字は、< 6桁の長さであるので、> = 6桁の数字は常に新しい文字列の先頭である「」で囲まれていない
    • ライン
    • 数が増加し、その文字列の前の数字は、私が取得する必要があり
    • \tにまたは\n私はタブや改行のようなすべての特殊文字を変換したい
    • の背後にあるものよりも常に低く、 b文字列の長さを維持する必要があります。

    私はまだここにいないので、これを間違った場所に置いたり、すでに回答があった場合は教えてください。

  • +5

    予想される出力を持つファイルのサンプルをコピーしてコピーできますか? – Inian

    +0

    出発点として、おそらくこれを 'awk'で見てみたいと思うでしょう。 –

    +3

    例が便利です! –

    答えて

    0

    "UTF-8-BOM encoded"がトラップではないことを願っています。
    ここに私の提案はありません。 (末尾の改行付き)サンプル入力用

    bash-3.1$ sed -En '/^[0-9]{6,10}/!{:a;H;n;/^[0-9]{6,10}/!ba;x;s/\n/\\n/g;s/\t/\\t/g;p};/^[0-9]{6,10}/{x;s/\t/\\t/g;1!p;x;h;z;}' input.txt 
    

    出力:

    123456 \ tAをここにランダムな文字列
    123567 \トン別の文字列は、\ \ NITは\ nmultipleライン
    の上に行く時間をnこの通常の文字列TA 124567 \は再び

    私は、
    関連6-10桁はまた、常に行の先頭にあると仮定しましたそれ以外の場合は、トリッキーになります。


    文字列の長さは、各改行\nまたはタブ\tため1だけ増加します。
    要求された "\ n"と "\ t"はそれぞれ2文字であるためです。

    関連する問題