0

sedを使用して、印刷できない文字を他の印刷できない文字に置き換えるのに問題があります。具体的には、sedがTABで始まるテーブル内の行を検索し、バックスペースを「挿入」して、基本的にその行のテキストを前の行に移動させたいと考えています。

この理由は、テーブルが列に分割されており、一部の行が複数の行を占めているためです。

column1,row1    column2,row1,line1
                column2,row1,line2

こうなって欲しいです(っぽい)

column1,row1    column2,row1,line1         column2,row1,line2

(間隔は関係ありません)

しかし、私はこれを管理できないようです。\ t sand \ bという表現が認識されないかどうかはわかりませんが、私が試した方法ではないようです。これらの8進表現でエコーコマンドを取得することもできません

これらは私が試した種類のものです:

sed 's/^\t/\b/' file.txt newfile.txt


sed 's/^(`echo "\011"`)/`echo "\010"`/' file.txt newfile.txt

どんな助けでもいただければ幸いです。

4

3 に答える 3

4

私はsedではこれをしません。確かに、sedが行をホールドバッファに保存してから次の行を読み取り、空白で始まる場合は、ホールドバッファをポップして印刷し、現在の行を印刷することは可能です...しかし、コードはモデムのように見えますキャリアを失った。

awkを使用します。

awk '/^[^ \t]/ && buf{print buf;buf=""} {buf=buf $0} END{print buf}' input.txt

これは何をしますか?

  • 2番目のセクション、{buf=buf $0}は、現在の行を。という名前のバッファに追加しbufます。
  • 次に、最初のセクション(まだ設定されていない/^[^ \t]/ && buf{print buf;buf=""}ため、最初の行では無視されます)は、空白で始まらない行(つまり、新しい出力行の開始)について印刷します。その後、リセットします。bufbufbuf
  • 最後のセクションEND{print buf}、、は残り物を印刷します。
于 2012-07-12T14:36:33.847 に答える
1

これはsedの非常に醜い使用法ですが、機能します。

 echo "a
 <TAB here>b
 <TAB here>c
 <TAB here>d
 e" | sed ':begin N; /\n\t/'\!'n;  s/\n\t//; t begin'

bash\!看板の醜い脱出の功績を認められます。スクリプトでは、それを省略できます。

于 2012-07-12T12:16:27.840 に答える
0

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

sed '$!N;s/\n\t/\t/;P;D' file
于 2012-07-12T15:51:22.387 に答える