各行の最初の4文字を同じ行の終わりにコピーする方法は?


10

次のような一連の行があるとします。

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar.
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct.
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr.
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun.

最初の4文字(年)を取得し、行の最後にコピーして、次のようにする方法はありますか。

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar. 2001
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct. 2002
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr. 2003
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun. 2004

7
確かにあります::%g/^\d\{4}\d\@!/s/^\(\d\{4}\).*\zs/ \1/
佐藤桂

回答:


17
:% s/\v^(\d{4})(.*)$/\1\2 \1/ 

それを行う1つの方法です

  • \v 魔法のオプション、グループ化をエスケープする必要を回避する ()
  • ^ 行頭
  • \d{4} 正確に4桁に一致
  • .* 残りの行
  • \1 \2 一致したパターンが ()

編集:@Jair Lopezがコメントで言及しているため、正規表現をさらに改善できます。

:% s/\v^(\d{4}).*/& \1/ 

または同等のもの

:% s/\v^(\d{4}).*/\0 \1/ 
  • &そして\0全体のマッチしたパターンが含まれています

詳細については、vimregexregexのFAQ


3
:%s/\v^(\d{4}).*/& \1/短いコマンドになります。
JairLópez2016年

10

そして、マクロによる解決策:

qqyiwA <Esc>pj0q

つまり:

qq   Record the macro in the register q
yiw  Yank the text described by the text object iw (inner word): The date
A <Esc>   Append a white space to the end of the line and go back to insert mode
p    Paste the date
j0   Place your cursor on the first column of the next line (to be able to repeat the macro)
q    Stop recording

その後、と同じ行数だけマクロを再生できます3@a

編集 @evilsoupがコメントでそれを述べたように、バッファのすべての行でマクロを実行するより効果的な方法は、以下を使用することです:

:%normal @q

もちろん、変更する行を説明%する範囲で置き換えることができます。


3
あなたはまた、とのすべての行の上にそれを実行することができます:%normal @q
evilsoup

@evilsoup:言及してくれてありがとう、私は答えを編集します。
statox

6

ここに私がそれをする方法があります:

:%norm y4lA <C-o>p

説明:

:%norm                     "Apply the following keystrokes to every line:
       y4l                 "Yank 4 letters. You could also do 'yiw'
          A                "Add a space to the end
            <C-o>          "Do a single normal command
                 p         "Paste

4

標準のUNIXコマンドにアクセスできる場合は、次のコマンドを使用できますAWK

:%!awk '{print $0" "$1}'

それでは、vi / vim、または最初の4文字ではありません。
パイプ

1
考えられるの:help filterは組み込みのVim機能であり、その機能によってVimがUNIXパラダイムにどの程度適合することができるかを考えると、実際には非常にvi / vimと言えます。
romainl 2016年

1

これを行うための既存のメカニズムの方が優れていると思いますが、ビジュアルブロックモードを使用してこれを行うことも可能です

日付をコピーします。

gg          # Go to the top of the file
<ctrl>y     # Enter visual block mode
G           # Go to the bottom of the file
w           # Select the first word
"jy         # Copy in to the j register

最初の行の終わりを埋める:

gg      # Top of file
A       # Append the line
        # Some spaces
<ESC>   # Return to command mode

ペースト:

gg 
# Move right to the length of the longest line
"jp   # Paste the block

4l代わりに行うことができることに注意してくださいllll
EvergreenTree 2016年

@EvergreenTree-更新されました。
sixtyfootersdude

0

UNIXコマンドラインから(またはUNIXコマンドラインツールがインストールされている場合はWindows)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.