Как присоединиться к строкам кратных чисел на основе шаблона?

Я хочу присоединиться к нескольким строкам в файле на основе шаблона это обе доли строк.

Это - мой пример:

{101}{}{Apples}
{102}{}{Eggs}
{103}{}{Beans}
{104}...
...

{1101}{}{This is a fruit.}
{1102}{}{These things are oval.}
{1103}{}{You have to roast them.}
{1104}...
...

Я хочу присоединиться к строкам {101}{}{Apples} и {1101}{}{This is a fruit.}

к одной строке {101}{}{Apples}{1101}{}{This is a fruit.} для последующей обработки.

То же идет для других строк.

Как Вы видите, обе строки совместно используют номер 101, но я понятия не имею, как осуществить это. Какие-либо Идеи?

/ РЕДАКТИРОВАНИЕ:

Я нашел "обходное решение":

Во-первых, удалите все предыдущие "{1" символ от группы два в ВИЗУАЛЬНОМ Блочном режиме с C-V (или подобный ярлык), затем вид все строки числом с :%sort n, затем присоединитесь к каждой второй строке с :let @q = "Jj" сопровождаемый 500@q.

Это работает, но оставляет меня с {101}{}{Apples} 101}{}{This is a fruit.}. Я должен был бы затем добавить отсутствующие символы "{1" в каждой строке, не совсем что я хочу. Любая справка ценится.

4
задан 15.09.2017, 23:41

2 ответа

Вместо того, чтобы удалить {1, просто сделайте

:%sort rn /\d\d\d}/

Это сделает числовой вид, но на каждой строке он только посмотрит на три цифры, сопровождаемые}.

Кроме того, для присоединения к строкам впоследствии я сделал бы

:g/{\d\d\d}/j!
3
ответ дан 07.12.2019, 20:25

Вот способ сделать это в оболочке с файлом:

join -j 2 \
    <(sed -n '/^{...}/{s/{/{ /;s/}/ }/;p}' inputfile) \
    <(sed -n '/^{....}/{s/{./& /;s/}/ }/;p}' inputfile) |
    sed 's/^\([^ ]*\) { }{}\({[^}]*}\) {1 }\({.*}\)$/{\1}{}\2{1\1}\3/'

Это использует первые два вызова sed разделять файл на основе количества цифр между первым набором фигурных скобок и добавляет пробелы вокруг последних трех цифр ({101} становится { 101 } и {1101} становится {1 101 }). Затем это использует те трехзначные числа в качестве поля для join командная клавиша на. Последнее sed команда откладывает цифры, где они принадлежат, и удаляет дополнительные пространства, добавленные ранее.

A vim гуру мог, вероятно, сделать что-то лучше в vim. Я мог сделать что-то более простое, чем вышеупомянутое использование AWK.

2
ответ дан 07.12.2019, 20:25

Теги

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