Заменить строку в верхнем или нижнем регистре с Awk - PullRequest
0 голосов
/ 30 августа 2018

Как мне взять такую ​​строку:

sample="+TEST/TEST01/filetest01.txt"

И замените все вхождения test01/TEST01 на test02/TEST02, оставив текст в том же регистре. Таким образом, желаемый результат будет:

"+TEST/TEST02/filetest02.txt"

Если вы должны были передать строку замены TEST03. Тогда желаемый результат будет

"+TEST/TEST03/filetest03.txt"

Если текст замены был Test04. Желаемый вывод:

"+TEST/TEST04/filetest04.txt"

Я пробовал это:

echo "$sample" | awk 'BEGIN{IGNORECASE=1}{gsub("test01", "test02");print}'

Заменяет значение в нижнем регистре, но не в верхнем.

Я не могу использовать sed, так как у меня есть версия, которая не поддерживает переключатель /I для игнорирования регистра.

Моя конечная цель - иметь возможность использовать переменные, которые представляют Предмет для изменения. Таким образом, переменные будут выглядеть так:

text2replace=test01
replacetext=test02

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Perl хорош для этого

$ perl -pe 's/test\K01/02/ig' <<< "+TEST/TEST01/filetest01.txt"
+TEST/TEST02/filetest02.txt

Директива \K дает указание механизму регулярных выражений сопоставлять то, что находится с левой стороны от него, а затем забывает об этом. Он действует для позиционирования «курсора» на начало «01», только когда ему предшествует «тест».

Я также использую флаг i для сопоставления без учета регистра.


В более общем случае, если вы хотите увеличить цифры, следующие за "тестом" без учета регистра (и добавление нуля к той же величине):

perl -pe 's/test\K(\d+)/ sprintf "%0*d", length($1), $1+1 /eig' <<INPUT
+TEST/TEST01234/filetest00009.txt
INPUT
+TEST/TEST01235/filetest00010.txt
0 голосов
/ 30 августа 2018

Вы говорите, что у вас нет GNU sed с флагом I, но вы можете сделать это с помощью POSIX sed:

$ sed 's/\([Tt][Ee][Ss][Tt]0\)1/\12/g' <<< '+TEST/TEST01/filetest01.txt'
+TEST/TEST02/filetest02.txt

[Tt] - нечувствительное к регистру совпадение бедняка для T или t; дело сохраняется с помощью группы захвата.

0 голосов
/ 30 августа 2018

Попробуйте это с помощью gnu-awk: gawk:

echo "$sample" | awk 'BEGIN{IGNORECASE=1}{print gensub("test01", "test02", "g")}'

Выход

+TEST/test02/filetest02.txt

Область последнего шанса

echo "$sample" |
    tr '[[:upper:]]' '[[:lower:]]' |
    awk '{gsub("test01", "test02");print}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...