sed、awk、perl、またはvimを使用したテキストブロックの置き換え

sed、awk、perl、またはvimを使用したテキストブロックの置き換え

6行ブロックの各インスタンスを別の6行ブロックに置き換えようとしています。 6行ブロックの2つの列を6行ブロックの1列に減らすだけです。

ご意見ありがとうございます。この質問をより明確にしましょう。私はいくつかのギタータブテキストファイルを持っていますが、それぞれには多くの音楽「ライン」が含まれています。音楽の各「行」には、6つの(同じ数のギター行)連続したテキスト行があります。音楽の「行」の間には空行(またはテキストを含む)があります。一般に、この6つの「行」は長さが約200列であり、6つの垂直行を6つの垂直行に置き換えて行の長さを短くしたいと思います。

例えば。最初のブロックを2番目のブロックに減らしたいです。

|------------------|    |-------|            
|------------------|    |-------|    
|-0----------------|    |-0-----|   
|-2-----2-----2----|    |-2-2-2-|     
|-------2----------|    |---2---|       
|-------------0----|    |-----0-| 

次のコードを試しました(unix.stackexchangeを参照)。1)成功しませんでした:

sed -i '/--/,/--/,/--/,/--/,/--/,/--/c\
-\
-\
-\
-\
-\
-' a.txt

awk、vim、またはperlを使用してより良い結果を得ることができませんでした。

たとえば、 awk とフィールド区切り文字 empy を使用する部分的な解決策は、文字が両方とも null または "-" の 2 つの連続した列を見つけることです。次に、2つの列のいずれかを削除します。しかし、どうすればいいのかわかりません。

ベストアンサー1

あなたが投稿したタブレットは、6桁の曲であることに基づいているようです。-x----ここでxフレット番号またはダッシュは次のとおりです。このように:

 123456123456123456
 -x-----x-----x----
|------------------|
|------------------|
|-0----------------|
|-2-----2-----2----|
|-------2----------|
|-------------0----|

もしそうならみんなこの間隔を使用すると、他の行を考えずにフラグメントを変更していくつかのダッシュを削除できます。

$ sed -Ee 's/-(.)----/-\1/g; s/\|/-|/2' < tab
|-------| 
|-------|
|-0-----|
|-2-2-2-|
|---2---|
|-----0-|

ただし、同じファイルに異なる間隔でタブを作成すると、各タブの間隔を識別する必要があるため、より困難になり、通常は最初の行でもこれを実行できません。 (あなたの例のように空になる可能性があるからです。)

より一般的なケースで私が提案できる解決策は、全体の楽譜をデコードしてからそれを再印刷することですが、これはこの答えには適していません。


sedの/this/,/that/構文は、最初の行が一致する行ブロックを処理します/this/最後行が一致/that/し、ブロックに次が含まれます。みんな間の線。/--/,/--/,/--/,...したがって、ブロックの始まりと終わりよりも多くのパターンがあるので、これは不可能なことです。

タブレットのように見えるブロックを一致させるには、一致してからブロックに|-6行を拡張する必要があります。 GNU sedではこれを使用できます/^|-/,+6

おすすめ記事