Мне нужно заменить 1
на один
, два
на 2
и так далее, но 11, например, должно остаться без изменений. Использование
sed -i 's/1/one/g'
filename также меняет 11.
Я не знаю, как проверять строка за строкой, и меняю только то, что мне нужно. Есть ли другой способ?
Можно сделать это с 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
Вы можете
выпишите все замены
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
используйте 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
цикл по остроте с 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