У меня есть исходный код, распределенный по нескольким файлам.
- У него есть шаблон,
abcdef
который мне нужно заменитьpqrstuvxyz
. - Шаблон может быть
Abcdef
(Случай предложения), тогда его нужно заменить наPqrstuvxyz
. - Шаблон может быть
AbCdEf
(случай переключения), тогда его необходимо заменить наPqRsTuVxYz
.
Короче говоря, мне нужно сопоставить регистр исходного шаблона и применить соответствующий шаблон назначения.
Как я могу добиться этого с помощью sed
или любого другого инструмента?
text-processing
sed
awk
user1263746
источник
источник
ABcDeF
?ABcDeF
->PQrStUvxyz
, то, конечно,AbCdEf
->PqRsTuvxyz
будет логически последовательным. Если регистр нужно скопировать из одной строки в другую, что должно произойти, если вторая строка замены длиннее.Ответы:
Портативное решение с использованием
sed
:С GNU sed это немного проще:
Используя
&&&
выше, мы повторно случай шаблон строки для остальной части замены, такABcdef
будет измененPQrstuVWx
иAbCdEf
вPqRsTuVwX
. Измените его, чтобы&
повлиять только на регистр первых 6 символов.(обратите внимание , что он не может делать то , что вы хотите , или может работать в бесконечный цикл , если замена может быть предметом замещения (например , если подставляя
foo
дляfoo
, илиbcd
дляabcd
)источник
Портативное решение с использованием
awk
:Пример ввода:
Пример вывода:
Обновить
Как указано в комментариях, выше будет заменять только первый экземпляр
find
в каждой строке. Чтобы заменить все экземпляры:Пример ввода:
Пример вывода:
источник
Вы могли бы использовать
perl
. Прямо из часто задаваемых вопросов - цитата изperldoc perlfaq6
:Как заменить без учета регистра на LHS при сохранении регистра на RHS?
Вот прекрасное решение Perlish Ларри Рослера. Он использует свойства побитового xor в строках ASCII.
И здесь это как подпрограмма, смоделированная после вышеупомянутого:
Это печатает:
В качестве альтернативы, чтобы сохранить регистр заменяющего слова, если оно длиннее исходного, вы можете использовать этот код Джеффа Пиньяна:
Это меняет предложение на «это дело УСПЕХА».
Просто чтобы показать, что C-программисты могут писать на C на любом языке программирования, если вы предпочитаете более C-подобное решение, следующий скрипт заставляет замену иметь тот же случай, буква за буквой, что и оригинал. (Также бывает, что он работает примерно на 240% медленнее, чем работает решение Perlish.) Если подстановка содержит больше символов, чем подставляемая строка, регистр последнего символа используется для остальной части подстановки.
источник
Если вы урежете заменить на
pqrstu
, попробуйте это:Входные данные:
Ouput:
Если вы хотите заменить на
prstuvxyz
, может быть это:Я не могу найти никаких правил для карты
ABcDeF
->PQrStUvxyz
.источник
Нечто подобное сделало бы то, что вы описали.
источник