vi/vim, как я могу записать n-е слово всех строк в новый файл

Siento que algo anda mal con el siguiente método. Solo pensé que lo mantendría aquí:


Resolví el problema creando un enlace simbólico con dicho comando:

sudo ln -svf /home/me/etc/systemd/system/report.service /etc/systemd/system/report.service

También se debe agregar la siguiente línea a la sección [Service]dereport.service:

After=home.mount

... para asegurarse de que homeesté montado.

1
11.07.2019, 17:57
4 ответа

Это можно сделать из командной строки терминала с помощью простого сценария bash. Первый цикл по содержимому файла . Затем для каждой строки передайте эхо в awk и пусть awk извлечет второй столбец . Наконец, перенаправьте этот текст в новый файл.

Собираем все вместе:

while read line; do
    echo $line | awk '{print $2}' >> new_file.txt
done <old_file.txt
0
27.01.2020, 23:30

Первый шаг: удалить все слова, кроме второго, в каждой строке. Это довольно простая :%normкоманда:

:%norm dwwhD

Это похоже на ввод dwwhDвручную в каждой строке, но быстрее. Второй шаг, сохранить в новый файл:

:w new_file.txt

А затем выйти без сохранения, чтобы old_file.txtосталось без изменений:

:q!
2
27.01.2020, 23:30

Используйте команду :sс регулярным выражением:

:%s/\v^\s*\S+(\s+(\S+).*)?/\2

\vговорит Vim использовать "очень волшебный" стиль регулярных выражений, который похож на расширенные регулярные выражения в grep или pcre.

Регулярное выражение соответствует одному слову в начале, возможно, которому предшествует некоторый необязательный пробел. Затем, после еще нескольких пробелов, внутри группы \2фиксируется второе слово. Наконец, .*соответствует всей остальной части строки.

Часть после первого слова необязательна (, сгруппирована в круглые скобки и сделана необязательной с последним?). Это гарантирует, что строки с одним словом по-прежнему будут сопоставляться, и в этом случае они будут заменены пустой строкой, что, как я полагаю, следует ожидать от строки с одним словом, поскольку вторая работа в этом случае пуста. кейс. Это одно из преимуществ использования регулярных выражений для этой задачи, так как вы получаете больше контроля над тем, что делать со строками, которые имеют угловые регистры.

Наконец, группа \2используется для замены. Он захватил второе слово в строке само по себе.

Затем вы можете сохранить измененное содержимое под новым именем файла:

:saveas new_file.txt

Это сохранит ваш немодифицированный old_file.txtи гарантирует, что дальнейшие модификации текущего буфера будут выполняться только в new_file.txt.

0
27.01.2020, 23:30
:!cut % '-d ' -f2 > new_file.txt

Обратите внимание, что разделителем по умолчанию для cutявляется табуляция, поэтому вы можете использовать ' -d ', чтобы установить в качестве разделителя пробел.

Изнутри Vi вы можете использовать %в качестве замены текущего имени файла.

1
23.11.2021, 09:05

Теги

Похожие вопросы