Может ли sed искать и заменять совпадения, если это совпадение только в части строки? - PullRequest
4 голосов
/ 10 февраля 2012

Sed ниже выведет ввод точно.Я хотел бы заменить все вхождения _ на - в первой соответствующей группе (\ 1), но не во второй.Возможно ли это?

echo 'abc_foo_bar=one_two_three' | sed 's/\([^=]*\)\(=.*\)/\1\2/'
abc_foo_bar=one_two_three

Итак, я надеюсь получить вывод:

abc-foo-bar=one_two_three

Я бы предпочел не прибегать к awk, так как я делаю строкудругие команды sed тоже, но я прибегну к этому, если придется.

Редактировать: Незначительное исправление для RE

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

Вы можете сделать это в sed, используя пробел:

$ echo 'abc_foo_bar=one_two_three' | sed 'h; s/[^=]*//; x; s/=.*//; s/_/-/g; G; s/\n//g'
abc-foo-bar=one_two_three
1 голос
/ 10 февраля 2012

Это может работать для вас:

echo 'abc_foo_bar=one_two_three' | 
sed 's/^/\n/;:a;s/\n\([^_=]*\)_/\1-\n/;ta;s/\n//'
abc-foo-bar=one_two_three

Или это:

echo 'abc_foo_bar=one_two_three' | 
sed 'h;s/=.*//;y/_/-/;G;s/\n.*=/=/'
abc-foo-bar=one_two_three
1 голос
/ 10 февраля 2012

Вы можете использовать ghc вместо sed следующим образом:

echo "abc_foo_bar=one_two_three" | ghc -e "getLine >>= putStrLn . uncurry (++) . (map (\x -> if x == '_' then '-' else x) *** id) . break (== '=')"

Вывод будет, как и ожидалось:

abc-foo-bar=one_two_three
1 голос
/ 10 февраля 2012

Вы можете использовать awk вместо sed следующим образом:

echo 'abc_foo_bar=one_two_three' | awk -F= -vOFS== '{gsub("_", "-", $1); print $1, $2}'

Вывод будет, как и ожидалось:

abc-foo-bar=one_two_three
...