Обратные ссылки sed использовались для замены - PullRequest
0 голосов
/ 04 декабря 2018

есть строка a_b_c_d.Я хочу заменить _ на - в строке между a_ и _d.Ниже идет обработка.

echo "a_b_c_d" | sed -E 's/(.+)_(.+)_(.+)/\1`s/_/-/g \2`\3/g'

Но это не работает.как я могу использовать \2 для замены его содержимого?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

gnu sed:

$ sed -r 's/_/-/g;s/(^[^-]+)-/\1_/;s/-([^-]+$)/_\1/' <<<'x_a_b_c_y'
x_a-b-c_y

Идея состоит в том, чтобы заменить все _ на -, а затем восстановить те, которые вы хотите сохранить.

update

если поля, разделенные _, содержат -, мы можем использовать ge gnu sed:

 sed -r 's/(^[^_]+_)(.*)(_[^_]+$)/echo "\1"$(echo "\2"\|sed "s|_|-|g")"\3"/ge'

Например, мы хотим, чтобы ----_f-o-o_b-a-r_---- было ----_f-o-o-b-a-r_----:

 sed -r 's/(^[^_]+_)(.*)(_[^_]+$)/echo "\1"$(echo "\2"\|sed "s|_|-|g")"\3"/ge' <<<'----_f-o-o_b-a-r_----'
----_f-o-o-b-a-r_----    
0 голосов
/ 05 декабря 2018

Следуя совету Кента, и если вам не нужно общее решение, это работает:

$ echo 'a_b_c+d_x' | tr '_' '-' | sed -E 's/^([a-z]+)-(.+)-([a-z]+)$/\1_\2_\3/g'
$ a_b-c+d_x

Классы символов должны быть скорректированы, чтобы соответствовать передней и конечной частям вашей входной строки.Сбой, конечно, если a или x содержат символ «-».

0 голосов
/ 04 декабря 2018

Perl позволяет использовать код в секции замены с модификатором e

$ echo 'a_b_c_d' | perl -pe 's/a_\K.*(?=_d)/$&=~tr|_|-|r/e'
a_b-c_d
$ echo 'x_a_b_c_y' | perl -pe 's/x_\K.*(?=_y)/$&=~tr|_|-|r/e'
x_a-b-c_y
  • $&=~tr|_|-|r здесь $& - это совпадающая часть, и tr применяется для замены_ до -
  • a_\K это будет соответствовать a_, но не будет частью совпадающей части
  • (?=_d) положительное ожидание, чтобы соответствовать _d, но выиграло 'быть частью совпадающей части


С sed (проверено на GNU sed 4.2.2, не уверен в синтаксисе для других версий)

$ echo 'a_b_c_d' | sed -E ':a s/(a_.*)_(.*_d)/\1-\2/; ta'
a_b-c_d
$ echo 'x_a_b_c_y' | sed -E ':a s/(x_.*)_(.*_y)/\1-\2/; ta'
x_a-b-c_y
  • :a метка a
  • s/(a_.*)_(.*_d)/\1-\2/ заменить одну _ на - между a_ и _d
  • ta перейти к метке a до тех пор, показамена удалась
...