Как я создал бы VIM или команду Vi для удаления всего текста после определенного символа для каждой строки в текстовом файле?

15
задан ib. 30 September 2011 в 04:42
поделиться

11 ответов

:%s/^\v([^|]+\|[^|]+)\|.*$/\1/
30
ответ дан 30 November 2019 в 23:56
поделиться

Просто другая энергия способ сделать то же самое:

%s/^\(.\{-}|\)\{2}\zs.*//
%s/^\(.\{-}\zs|\)\{2}.*// " if you want to remove the 2nd pipe as well

На этот раз, regex соответствует как можно меньше (\{-}) символы, которые сопровождаются каналом, и дважды (\{2}), они проигнорированы ( \zs) для замены всех после (\z s) текст ничем.

4
ответ дан 30 November 2019 в 23:56
поделиться

Можно также записать макрос:

qq02f|Djq

и затем Вы сможете играть его с 100@q для выполнения макроса на следующих 100 строках.

Макро-объяснение:

  • qq - запускается, макрос, записывающий
  • 0 - , переходят к первому символу строки
  • 2f | - , находят второе возникновение | символ на строке
  • , D - удаляет текст после текущей позиции в конец строки
  • , j - переходит к следующей строке
  • q - макрос концов запись
18
ответ дан 30 November 2019 в 23:56
поделиться

Если бы Вы не должны использовать энергию, другая альтернатива была бы командой "сокращения" Unix.

cut -d '|' -f 1-2 file > out.file
8
ответ дан 30 November 2019 в 23:56
поделиться

Вот sed решение:

sed -e 's/^\([^|]*|[^|]*\).*$/\1/'
0
ответ дан 30 November 2019 в 23:56
поделиться

Я нашел, что энергия не сильна в обработке очень больших файлов. Я не уверен, насколько большой Ваш файл. Возможно, кошка и sed вместе работали бы лучше.

0
ответ дан 30 November 2019 в 23:56
поделиться

Это отфильтрует все строки в буфере (1, $) посредством сокращения, чтобы сделать задание.

:1,$!cut -d '|' -f 1-2

Попытка с

:.!cut -d '|' -f 1-2

, Чтобы сделать это только на текущей строке.

0
ответ дан 30 November 2019 в 23:56
поделиться

Можно также сделать:

:%s/^\([^\|]\+|[^\|]\+\)\|.*$/\1/g
1
ответ дан 30 November 2019 в 23:56
поделиться

Почему энергия использования?

, Почему не просто делают

cat my_pipe_file | cut -d'|' -f1-2
0
ответ дан 30 November 2019 в 23:56
поделиться

Использование: команда, чтобы сделать команду пользователя, которую вы можете легко запустить.

:command -range=% YourNameHere <line1>,<line2>s/^\v([^|]+\|[^|]+)\|.*$/\1/
2
ответ дан 30 November 2019 в 23:56
поделиться

использовать awk.

awk -F"|" '{$0=$1"|"$2}1' file
1
ответ дан 30 November 2019 в 23:56
поделиться