Как я могу поменять первое слово линии с последним словом в строке

Вы должны получить исходный код ядра, исправить его и перекомпилировать. Изменить скомпилированный двоичный файл вручную чрезвычайно сложно, и легко допустить ошибку.

0
29.11.2018, 00:12
2 ответа

Полу -серьезный ответ :это не ты, ты в порядке. Проблема полностью в многословности команды 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 не включает обратные ссылки. Для этой команды также потребуется реализация с расширениями.

1
28.01.2020, 02:13

Использование 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, так как нет не -жадного модификатора, такого как ?после .*.

4
28.01.2020, 02:13

Теги

Похожие вопросы