Вы должны получить исходный код ядра, исправить его и перекомпилировать. Изменить скомпилированный двоичный файл вручную чрезвычайно сложно, и легко допустить ошибку.
Полу -серьезный ответ :это не ты, ты в порядке. Проблема полностью в многословности команды sed
's s///
(, сравните это с альтернативными ответами):
$ echo "Hello some good world!" |
sed 's/\(^[^[:space:]]\+\)\([[:space:]].*[[:space:]]\|[[:space:]]\+\)\([^[:space:]]\+$\)/\3\2\1/'
world! some good Hello
Мы также можем поменять местами первое и последнее слова, даже если у нас есть пробелы перед первым и/или после последнего (благодаря комментариям и другим ответам):
$ echo " Hello some good world! " |
sed 's/^\([[:space:]]*\)\([^[:space:]]\+\)\([[:space:]].*[[:space:]]\|[[:space:]]\+\)\([^[:space:]]\+\)\([[:space:]]*\)$/\1\4\3\2\5/'
world! some good Hello
Однако эти команды используют некоторые не -POSIX-расширения GNU для синтаксиса BRE -Basic Regular Expression -(, а именно +
и|
).
(Более переносимая )команда, которая удовлетворяет стандарту POSIX, сохраняя при этом удобство чередования (|
), потребует расширенных регулярных выражений. Например, использование GNU sed
с опцией --posix
(, которая отключает расширения GNU -, фактически не требуемые):
$ echo " Hello some good world! " |
sed --posix -E 's/^([[:space:]]*)([^[:space:]]{1,})([[:space:]].*[[:space:]]|[[:space:]]{1,})([^[:space:]]{1,})([[:space:]]*)$/\1\4\3\2\5/'
world! some good Hello
Обратите внимание, однако, что синтаксис POSIX ERE не включает обратные ссылки. Для этой команды также потребуется реализация с расширениями.
Использование Perl и предположение, что ввод и вывод разделены пробелами -:
perl -ape '($F[0],$F[-1])=($F[-1],$F[0]);$_="@F\n"'
Тестур:
$ printf 'Cleanse Fold and Manipulate\n' | perl -ape '($F[0],$F[-1])=($F[-1],$F[0]);$_="@F\n"'
Manipulate Fold and Cleanse
Код Perl, использующий -a
для разделения входных данных по пробелам в массив @F
, просто меняет местами два элемента в начале и в конце этого массива перед объединением результирующего списка с пробелами, добавляя новую строку в конце конец.
Более короткий вариант Perl, который сопоставляет первое и последнее слова и меняет их местами в подстановке (это предполагает, что во входных данных нет боковых пробелов):
perl -pe 's/^(\w*)(.*?)(\w*)$/$3$2$1/'
Средний бит, .*?
, соответствует середине строки без -жадности. Мы не могли бы сделать это так легко с sed
, так как нет не -жадного модификатора, такого как ?
после .*
.