SED удаление пробелов внутри строки - PullRequest
2 голосов
/ 15 мая 2010

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

var test = 'Some test text here.';

Я хочу получить:

var test = 'Sometesttexthere.';

Я пытался использовать (\x27 соответствует '):

sed 's|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|g

но это просто дает

var test = 'Sometest text here.';

Есть идеи?

Ответы [ 2 ]

1 голос
/ 15 мая 2010

Это гораздо более сложный sed скрипт, но он работает без цикла. Вы знаете, просто ради разнообразия:

sed 'h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g'

Создает копию строки, разбивает одну (которая станет второй половиной) в первой одинарной кавычке, отбрасывая первую половину, заменяет все пробелы во второй половине, меняет местами копии, разбивает другую, отбрасывая вторая половина, объединяет их вместе и удаляет новые строки, используемые для разбиения, и строку, добавленную командой G.

* * 1008 Edit: * * 1010

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

sed '/.*=.*\x27.*\x27.*/ {h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g}'

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

0 голосов
/ 15 мая 2010

В вашей командной строке есть две проблемы:

  • Во-первых, отсутствует \ после [^.

  • Во-вторых, даже если вы используете модификатор g, удаляется только первый пробел. Зачем? Потому что этот модификатор приводит к замене последовательных совпадений в пределах одной строки. не повторно сканирует всю строку с начала. Но здесь это необходимо, потому что ваше совпадение привязано к начальному ' строкового литерала.

Очевидный способ решить эту проблему - использовать цикл, реализованный условным переходом (переход с tLabel на :Label; t переходов, если хотя бы один s соответствовал со времени последнего теста с t).

Это проще всего с помощью сценария sed (и вам не нужно экранировать '), например:

:a
s|'\([^'[:space:]]*\)[[:space:]]|'\1|
ta

Но это можно сделать из командной строки. Точный синтаксис может зависеть от вашего вкуса sed, для моего (super-sed в Windows) он вызывается так:

sed -e ":a" -e "s|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|;ta"

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

...