Заменить символ только в том случае, если ему предшествует цифра

Предположим, что у меня есть файл, содержащий

abcxd,abcx,6000/600x1 

Мне нужно заменить x на * которого есть число перед ним. Я пытался

 sed 's/[0-9]x/*/g' 

но это неправильно, поскольку ожидаемый результат:

 abcxd,abcx,6000/600*1 

  • Могу ли я использовать `sed` для перевода символов, например, с помощью` tr`?
  • (Mac Terminal) sed для анализа JSON ... что я делаю неправильно?
  • разбиение файла на строки, разделенные вкладками на два файла
  • Добавление макроса TeX в начало файла с помощью sed (почему мой метод не работает?)
  • иметь файл журнала, который я хотел бы разбить на несколько файлов на основе контента
  • Проблема удаления / замены специального символа °
  • сценарий оболочки для извлечения символов
  • У sed есть функция, превосходящая awk?
  • 2 Solutions collect form web for “Заменить символ только в том случае, если ему предшествует цифра”

    Использовать группы захвата и обратную ссылку

     $ echo 'abcxd,abcx,6000/600x1' | sed 's/\([0-9]\)x/\1*/g' abcxd,abcx,6000/600*1 
    • \([0-9]\) захватить эту цифру, чтобы на нее можно было ссылаться \1
      • См. Раздел « Группы захвата» для более подробного обсуждения этого использования регулярных выражений
    • С ERE синтаксисом будет sed -E 's/([0-9])x/\1*/g'
    • Модификатор g необходим, если необходимо заменить несколько совпадений. Для данного образца он не нужен

    С ароматами регулярных выражений, такими как pcre , можно использовать lookarounds

     $ echo 'abcxd,abcx,6000/600x1' | perl -pe 's/(?<=\d)x/*/g' abcxd,abcx,6000/600*1 

    Попробуй это:

     $ echo "abcxd,abcx,6000/600x1" |\ sed -E 's/^([az,]*)([0-9\/]*)(x)(.*$)/\1\2*\4/' 
    Linux и Unix - лучшая ОС в мире.