2012-04-10 5 views
3

Я пытаюсь заменить все несоответствующими символам в одной строке между определенными столбцами (после поиска).Заменить все несоответствующие символы между определенными столбцами

Пример:
Поиск может быть все
В приведенном ниже примере поиска = test
заменителя характер, не являющихся символами согласующих: пустое пространство.

Я хочу заменить все символы, не входящие в «test» между столбцами 10 и 30.
Столбцы 10 и 30 обозначены |

before: djd<aj.testjal.kjetestjaja testlala ratesttsuvtesta !<-a- 
        |     | 
after: djd<aj.test  test  testlala ratesttsuvtesta !<-a- 

Как я могу реализовать это?

+1

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

+0

Иногда 10 символов иногда больше или меньше символов. Как бы вы разделили строку на 3 части и снова собрали их? – Reman

+0

Если бы я был строго в vim, я бы просто добавил строку, где хотел разбить строку, сделать замену, а затем снова присоединиться к строке. Если бы это было что-то, что я собирался делать на регулярной основе, я бы создал макрос, который будет делать замену и присоединяться к строкам (обязательно удалив посторонние пробелы после объединения). Мне нравится метод Бернхарда, но я никогда не пробовал. –

ответ

3

Используйте следующую команду замещения в этой строке.

:s/\(test\)\zs\|\%>9v\%<31v./\=submatch(1)!=''?'':' '/g 

Если диапазон столбцов задается с помощью визуального выбора, запустите

:'<,'>s/\(test\)\zs\|\%V./\=submatch(1)!=''?'':' '/g 
+0

Большое вам спасибо. Теперь я решил все свои вещи со столбцами! Просто чтобы лучше понять, что мне нужно изменить, чтобы сделать наоборот. Вместо строк в строке 10 и 30 заменяйте буквы «test»? Я просто немного поиграл с ним, переместил '\ zs' и изменил другие вещи, но ничего не получилось. Спасибо! – Reman

+1

Для дополнительной проблемы, если диапазон столбцов известен заранее, используйте команду ':% s/\%> 9vtest \% <32v/\ = repeat ('', strwidth (отправка (0)))/g' ; если этот диапазон указан с визуальным выбором, используйте ': '<,'> s/\% Vtes \% Vt/\ = repeat (' ', strwidth (отправка (0)))/g'. –

1

Один метод может быть, чтобы выбрать необходимый Вам диапазон столбца с использованием визуального режима (Control + V)

После выбора, поиска и замены может быть сделано с помощью (see this question)

%s/\%Vfoo/bar/g 

Регулярное выражение для не теста можно найти здесь: Regular expression to match a line that doesn't contain a word?

Смежные вопросы