Замените только определенные числа, используя sed [closed]

Я должен заменить 1 на one, two на 2 и так далее, но 11, например, должен оставаться неизменным. Использование

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

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

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

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

2 ответа

Вы можете сделать это с помощью perl:

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

perl

perl языка сценариев, который превосходит при обработке текста -l разумно заключить концы строк n автоматически печатать каждую строку e выполнить следующую команду ' начать инструкции s/ заменить (?<!\d) отрицательный lookbehind: совпадение не должно следовать за цифрой 1 literal 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 использовать массив 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
1
ответ дан 18 July 2018 в 13:52

Вы можете сделать это с помощью perl:

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

perl

perl языка сценариев, который превосходит при обработке текста -l разумно заключить концы строк n автоматически печатать каждую строку e выполнить следующую команду ' начать инструкции s/ заменить (?<!\d) отрицательный lookbehind: совпадение не должно следовать за цифрой 1 literal 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 использовать массив 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
1
ответ дан 24 July 2018 в 20:16
  • 1
    как насчет «замены two на 2? Вопрос непонятен, мы действительно не знаем, какие цифры OP хотят изменить, кроме 1 и 2 ... Я проголосовал за закрытие вопроса – Zanna 10 August 2017 в 18:15

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

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