К сожалению, в POSIX или любом другом awk, отличном от -busybox, требуется цикл для всех уникальных символов в каждой строке, поскольку обратные ссылки не поддерживаются в регулярном выражении:
$ cat tst.awk
{
old = new = $0
while (old != "") {
char = substr(old,1,1)
gsub(char,"",old)
if ( char ~ /[[:alnum:]_]/ ) {
gsub(char char,char char char,new)
}
}
print new
}
$ echo ab aa cc de mn | awk -f tst.awk
ab aaa ccc de mn
Описанное выше работает, когда целевые символы не являются метасимволами регулярного выражения, как в этом случае. Если бы они могли быть метасимволами RE, вам нужно было бы экранировать их, прежде чем использовать их в контексте регулярного выражения gsub ()s. Вы можете использовать char"{2}"
вместо char char
в регулярном выражении gsub (), если хотите.
См. ответ @Stephane о том, как выполнить эту задачу с помощью busybox awk.
Выполнение одиночных команд — это то, что find
можно сделать, но вы никогда не будете использовать его для выполнения. Это немного похоже на придумывание одной из тех бесполезных машин, видео о которых можно найти на YouTube .
Используя стандартный find
, вы можете выполнить dmesg
с помощью следующей команды.
find. -prune -exec dmesg \;
В этой команде find
мы пытаемся выполнить dmesg
, используя -exec
для текущего каталога, и мы используем -prune
, чтобы избежать поиска чего-либо в текущем каталоге. Когда больше нечего исследовать, find
заканчивается.
Команда не зависит от того, какой путь поиска мы даем find
, кроме того, что он должен существовать. Это также не зависит от того, разрешено ли текущему пользователю выполнять dmesg
или иметь dmesg
в своем $PATH
. Команда запустит утилиту dmesg
практически так же, как если бы она выполнялась непосредственно из командной строки.
Учитывая то, что было написано в комментариях, я думаю, что правильный ответfind / -name dmesg -type f -executable -exec {} \;