Вы делаете это так же, как меняет местами две переменные в C
илиBASIC
:tmp = a; a = b; b = tmp
;-)
Пример:
p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo
Замените FOO
выше любым символом или текстом, которого нет в вашей строке.
Используя -e
и восьмеричное число 55 для-
:
$ echo -e '\055n'
-n
... или восьмеричное 156 для n
, или восьмеричное для обоих:
$ echo -e '\055\0156'
-n
Если -e
вас беспокоит, установите параметр оболочки xpg_echo
, чтобы echo
всегда интерпретировал последовательности обратной косой черты (обычно это не то, что вам нужно):
$ shopt -s xpg_echo
$ echo '-\0156'
-n
echo
в bash
также распознает шестнадцатеричный:
$ echo -e '\x2d\x6e'
-n
Спасибо за все ответы. Я добавлю один из моих собственных, о котором я только что подумал:
echo -n -;echo n
Поместите любой символ перед " -n
" и используйте escape-последовательность " \b
" в режиме -e
, чтобы стереть его в конечном выводе. В приведенном ниже примере используется пробел для фиктивного символа :
$ echo -e " \b-n"
-n
Пояснение:
$ man echo
If -e is in effect, the following sequences are recognized:
\b backspace
Это работает визуально для печати вывода на терминал:
$ echo -e " \b-n" | tee /tmp/test
-n
$ cat /tmp/test
-n
Но вы можете столкнуться с проблемами, если вам нужно проанализировать вывод, так как он создает невидимый символ возврата:
$ echo -e " \b-n" | wc -c
5
$ wc -c <<< $(echo -e " \b-n")
5
$ echo -e "--" | wc -c
3