Заменить только определенные числа с помощью sed [closed]

Мне нужно заменить 1 на один , два на 2 и так далее, но 11, например, должно остаться без изменений. Использование

sed -i 's/1/one/g' 

filename также меняет 11.

Я не знаю, как проверять строка за строкой, и меняю только то, что мне нужно. Есть ли другой способ?

1
задан 10 August 2017 в 18:13

1 ответ

Можно сделать это с perl:

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt

Объяснение:

  • perl язык сценариев, который выделяется при обработке текста
  • -l имейте дело разумно с окончаниями строки
  • p автоматически распечатайте каждую строку
  • e выполните следующую команду
  • ' запустите инструкций
  • s/ замена
  • (?<!\d) отрицательный lookbehind: соответствие не должно следовать за цифрой
  • 1 литерал 1
  • (?<!\d) отрицательное предвидение: соответствие не должно сопровождаться цифрой
  • /one замена с литералом one
  • /g замените всеми соответствиями
  • ' конец инструкций

Тест:

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt > test1.txt
head test*.txt
==> test.txt <==
1
11
111
a1
1a
1a1

==> test1.txt <==
one
11
111
aone
onea
oneaone

Обновление: автоматически измениться 1-9 с one-nine Вы можете

  1. выпишите все замены

    perl -lpe 's/(?<!\d)1(?!\d)/one/g;s/(?<!\d)2(?!\d)/two/g;s/(?<!\d)3(?!\d)/three/g;s/(?<!\d)4(?!\d)/four/g;s/(?<!\d)5(?!\d)/five/g;s/(?<!\d)6(?!\d)/six/g;s/(?<!\d)7(?!\d)/seven/g;s/(?<!\d)8(?!\d)/eight/g;s/(?<!\d)9(?!\d)/nine/g;' test.txt
    
  2. используйте a perl массив

    perl -lpe '@a=qw(zero one two three four five six seven eight nine);s/(?<!\d)(\d)(?!\d)/$a[$1]/g' test.txt
    
  3. цикл по остроте с bash

    NUMBERS=(zero one two three four five six seven eight nine)
    for i in "${!NUMBERS[@]}"; do
        perl -i -lpe 's/(?<!\d)'$i'(?!\d)/'${NUMBERS[$i]}'/g' test.txt
    done
    
1
ответ дан 7 December 2019 в 15:36

Другие вопросы по тегам:

Похожие вопросы: