У меня есть 8000 с лишним файлов, и мне нужно их очистить. В настоящее время я использую эту команду sed для замены определенных символов на те, которые мне нужны:
find . -name "*.txt" -print | xargs sed -i 's/a/z/g'
Это рекурсивно меняет все a во всех файлах на z. Мой вопрос:
- Могу ли я указать несколько символов для сопоставления в команде, которую нужно изменить на z?
- Могу ли я удалить совпадающий символ вместо того, чтобы менять его на z?
Заранее спасибо.
решение1
Могу ли я указать несколько символов для сопоставления в команде, которую нужно изменить на z?
Да, можно. Это можно сделать, заключив несколько символов в квадратные скобки:
sed -i 's/[abc]/z/g' file.txt
Это заменит всеа,б, исперсонажи сз.
Это не заменитазбукасз, он заменит его наззз.
Могу ли я удалить совпадающий символ вместо того, чтобы менять его на z?
Это очень просто, просто замените его ничем:
sed -i 's/[abc]//g' file.txt
Это удалит всеа,б, исперсонажи.
Примечание: эти примеры также работают в вашем случае с find
& xargs
.
решение2
На оба вопроса можно ответить «да»:
1: Это можно сделать, используя так называемый класс символов [abcde], например
echo abcabcabc | sed -e 's/[abc]/z/g'
который заменяет все три a, b, c на z.
2: Если заменить на пустую строку, то будут удалены все соответствующие символы, например:
echo abcabcabc | sed -e 's/[ac]//g'
вы получаете только «б» обратно.