4

次のようなデータファイルがあります。

----------------------------
a b c d e .............
A B C D E .............
----------------------------

しかし、私はそれを次の形式にしたいです:

----------------------------
a A
b B
c C
d D
e E
...
...
----------------------------

VimまたはPerlで変換を行う最も簡単な方法は何ですか?

4

3 に答える 3

6

基本的:.s/ /SpaceCtrl+vEnter/gEnterjma:.s/ /Ctrl+vEnter/gEnterCtrl+v'axgg$p'adGにはトリックを行います。:)

OK、それを分解しましょう:

  1. :.s/ /Ctrl+vEnter/gEnter:現在の行( )で、すべての位置( )で、( )スペース( )をスペース.に置き換え、その後にキャリッジリターン( )を続けます。これで、カーソルは最後の文字の行にあるはずです(例では)。s/ /SpaceCtrl+vEnter/ge
  2. j:1行下に移動します(to A B C D E)。
  3. ma:マークaを現在の位置に設定します...後でこの位置を参照したいので。
  4. :.s/ /Ctrl+vEnter/gEnter:上記と同じ置換を行いますが、。はありませんSpace。これで、カーソルは最後の文字の行にあるはずです(E例では)。
  5. Ctrl+v'a:ブロック選択を使用して、現在のカーソル位置(E)からマークする(上記の手順3で設定した)から選択します。a
  6. x":選択範囲を(レジスターに)カットします。
  7. gg:カーソルを最初の行に移動します。
  8. $:カーソルを行末に移動します。
  9. p:前に切り取ったテキストをカーソル位置の後に貼り付けます。
  10. 'a:カーソルをaマーク(手順3で設定)に移動します。
  11. dG:カーソル位置からファイルの終わりまでのすべて(下部に残っている空の行)を削除します。

PS私は「組み込み」ソリューションについて学びたいと思っていましたが、そのような時までは...

于 2012-07-18T20:00:20.453 に答える
4

カーソルが2行の最初の行にあると仮定すると、コマンドを使用します

:s/ /\r/g|+&&|'[-;1,g/^/''+m.|-j
于 2012-07-20T13:41:54.907 に答える
4

列の単純な再マップ:

use strict;
use warnings;

my @a = map [ split ], <>;  # split each line on whitespace and store in array
for (0 .. $#{$a[0]}) {      # for each such array element
    printf "%s %s\n", $a[0]->[$_], $a[1]->[$_];   # print elements in order
}

使用法:

perl script.pl input.txt
于 2012-07-18T19:12:23.393 に答える