LINUX.ORG.RU

Строки: поиск, извлечение, замена.


0

1

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

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

${str//\//_} в данном случаее мы заменяем «/» на «_», но а когда то что мы «меняем» и на что «заменяем» постоянно меняться...

я припустил что это выглядит где то так

${str//$old/$new}

но увы оно работает так хорошо как в первом случае, и многие слова пропускает. Подскажите пожалуйста.

man bash

${parameter/pattern/string} Pattern substitution. The pattern is expanded to produce a pattern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with /, all matches of pattern are replaced with string. Nor‐ mally only the first match is replaced.

VAR=$(echo $VAR | sed "s/$old/$new/g")

При этому нужно следить, чтобы в $old и $new спецсимволы были экранированы.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Nor‐ mally only the first match is replaced.

Милейший не заметил что у топикстартера два слеша вместо одного, и что это другая операция?

belous_k_a
()

но увы оно работает так хорошо как в первом случае, и многие слова пропускает. Подскажите пожалуйста.

Хм, не могли бы вы найти пример того когда оно не работает, на тестовом примере в bash (4.2.20) оно нормально отработало.

belous_k_a
()
Ответ на: комментарий от belous_k_a

Милейший не заметил что у топикстартера два слеша вместо одного

Не заметил, my bad.

, и что это другая операция?

Да, не только мне надо очки протереть.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Т.е. вы мне беретесь доказать что однократная замена первой встречной подстроки эквивалентна замене всех вхождений? Да, вы мастер логических затейств!

belous_k_a
()
Ответ на: комментарий от belous_k_a

belous_k_a

Т.е. вы мне беретесь доказать что однократная замена первой встречной подстроки эквивалентна замене всех вхождений? Да, вы мастер логических затейств!

вы разве не заметили модификатора g в команде s sed? Эти команды эквивалентны (почти).

drBatty ★★
()
Ответ на: комментарий от belous_k_a

belous_k_a

А вы разве не заметили что sed никто не обсуждал?

а вы разве не заметили, что вариант schizoid, с которым вы спорите, именно эту sed и использует?

drBatty ★★
()
Ответ на: комментарий от drBatty

Милейший, а вы протрите очи черные, и обратите внимание на то, что я цитировал и к чему оно относилось. И умерьте пыл, а то заляпаете.

belous_k_a
()
Ответ на: комментарий от belous_k_a

ну делайте вид, что вы не понимаете, о чём я. Пыла никакого не было, мне ||.

drBatty ★★
()

когда то что мы «меняем» и на что «заменяем» постоянно меняться...

конструируй выражения, а потом делай им eval

anonymous
()
Ответ на: комментарий от schizoid

#!/bin/bash
r=«0»
s1=«ab»
str=«ab cgfahfahfabc»
str=$(echo $str | sed «s/$s1/$r/g»)
echo $str

выведено:
ab cgfahfahfabc
но если str=«ab cgfahfahfabc ab», ответ будет ab cgfahfahfabc 0

Hellscrem
() автор топика
Ответ на: комментарий от Hellscrem

Подскажите, пожалуйста, в чем мой недочет?)

Hellscrem
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.