Регулярное выражение: соответствует любому символу (включая пробелы), кроме запятой.

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

[^,]*

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

РЕДАКТИРОВАТЬ:

Это использует sed в vim через:% s / foo / bar / gc.

Я хочу найти начало от func до запятой, в следующем примере:

func("bla bla bla"
  "asdfasdfasdfasdfasdfasdf"
"asdfasdfasdf", "more strings")

I


person selecsosi    schedule 17.11.2012    source источник
comment
[^,] * соответствует до запятой? rubular.com/r/sAq4ufTDe2   -  person Oliver Atkinson    schedule 17.11.2012
comment
Кажется, с вашим шаблоном все в порядке. На всякий случай попробуйте один раз экранировать запятую, которая может потребоваться в используемом вами движке регулярных выражений: [^\,]*   -  person Sina Iravanian    schedule 17.11.2012
comment
[^,] * соответствует до запятой или до конца строки для меня. У меня возникли проблемы с попыткой заставить его продолжить поиск, пока он не найдет запятую, даже если он должен проходить через новые строки   -  person selecsosi    schedule 17.11.2012
comment
Я пытаюсь выполнить sed в vim через:% s / foo / bar / gc. Может ли это быть проблемой?   -  person selecsosi    schedule 17.11.2012
comment
ты проверил мое предложение?   -  person NeverHopeless    schedule 17.11.2012
comment
Я пробую твое предложение сейчас, NeverHopeless   -  person selecsosi    schedule 17.11.2012


Ответы (2)


Чтобы работать с multiline в SED с использованием RegEx, вы должны посмотреть здесь.

РЕДАКТИРОВАТЬ:

В команде SED работа с NewLine немного отличается. Команда SED поддерживает три шаблона для управления многострочными операциями N, P и D. Чтобы узнать, как это работает, см. это (Работа с несколькими строками ) объяснение. Здесь обсуждаются эти три операции.

Я предполагаю, что здесь упускается из виду оператор N. Добавление оператора N позволит распознавать \n в строке.

Пример из здесь:

Иногда нужно использовать символ новой строки в сценарии sed. Что ж, здесь есть некоторые тонкие проблемы. Если кто-то хочет найти новую строку, нужно использовать «\ n». Вот пример, в котором вы ищете фразу и удаляете символ новой строки после этой фразы, соединяя две строки вместе.

(эхо а; эхо х; эхо у) | sed '/ x $ / {N s: x \ n: x:}'

который порождает

a xy

Однако, если вы вставляете новую строку, не используйте "\ n" - вместо этого вставьте буквальный символ новой строки:

(эхо а; эхо х; эхо у) | sed 's: x: X \:'

генерирует

a X

y

person NeverHopeless    schedule 17.11.2012
comment
Похоже, это не сработало для меня, но, возможно, это произошло из-за того, что я не предоставил достаточно информации о своей проблеме. Я отредактировал исходный вопрос. По сути, я хочу найти строковую функцию (вплоть до запятой. У меня есть:% s / func ([^,] *, / bar / gc, но это не похоже на новые строки - person selecsosi; 17.11.2012
comment
Или, возможно, я не был уверен, куда положить (? М). Я поставил его прямо перед [^,] *. Пример:% s / func ((? M) [^,] *, / bar / gc. Это правильно? - person selecsosi; 17.11.2012
comment
В SED так не пойдет. проверьте это: unix.stackexchange.com/questions/26284/ - person NeverHopeless; 17.11.2012
comment
Можете ли вы дать мне ответ, чтобы я принял его? Также спасибо за помощь - person selecsosi; 17.11.2012
comment
Можете ли вы включить в свой ответ соответствующие части? Спасибо. - person phant0m; 17.11.2012

По сути, вы пытаетесь сопоставить шаблон на нескольких строках.

Вот один из способов сделать это в sed (хотя я почти уверен, что они не могут использоваться в vim, и я не знаю, как воспроизвести это в vim)

sed '
    /func/{
            :loop
            /,/! {N; b loop}
            s/[^,]*/func("ok"/
    }
' inputfile

Допустим, inputfile содержит эти строки

func("bla bla bla"
  "asdfasdfasdfasdfasdfasdf"
"asdfasdfasdf", "more strings")

На выходе

func("ok", "more strings")


Подробности:

  • Если строка содержит func, введите фигурные скобки.
  • :loop - это ярлык с именем loop
  • If the line does not contain , (that's what /,/! means)
    • append the next line to pattern space (N)
    • перейти к / перейти к loop метке (b loop)
  • Таким образом, он будет продолжать добавлять строки и цикл до тех пор, пока не будет найден ,, после чего будет запущена команда s, которая сопоставляет все символы до первой запятой с (многострочным) пространством шаблона и выполняет замену.
person doubleDown    schedule 17.11.2012