Учебник Linux, посвященный команде sed, дает мне следующий пример:
sed -e 's/\(<[^ ]*>\)\([ ]*\)\(<[^ ]*>\)/\3\2\1/g'
GNU Linux is cool
Linux GNU cool is
, но, в то время как я набираю точно ту же команду, что и около, он показывает мне:
sed -e 's/\(<[^ ]*>\)\([ ]*\)\(<[^ ]*>\)/\3\2\1/g'
GNU Linux is cool
GNU Linux is cool
Кто-нибудь может помочь мне решить это? Я использую Ubuntu 12.04LTS. Большое спасибо.
Это может просто быть проблема с форматированием форума, но <
и >
, по-видимому, предназначаются, чтобы быть привязки к слову и Escape обратной косой черты потребности как таковые \<
и \>
sed -e 's/\(\<[^ ]*\>\)\([ ]*\)\(\<[^ ]*\>\)/\3\2\1/g'
т.е.
echo 'GNU Linux is cool'| sed -e 's/\(\<[^ ]*\>\)\([ ]*\)\(\<[^ ]*\>\)/\3\2\1/g'
Linux GNU cool is
Однако как предыдущие плакаты, я также предложил бы использовать GNU -r
расширенная форма для сокращения количества Escape
sed -re 's/(\<[^ ]*\>)([ ]*)(\<[^ ]*\>)/\3\2\1/g'
, привязки к слову, будет казаться, не будут необходимы вообще, если Вы изменитесь *
(нуль или больше) к [1 110] (один или несколько)
echo 'GNU Linux is cool'| sed -re 's/([^ ]+)([ ]+)([^ ]+)/\3\2\1/g'
Linux GNU cool is
Хорошо я не знаю. Здесь было несколько проблем:
-r
) -e
), но это не было ошибкой /g
глобальный режим повреждает его, потому что это подкачивает последние три слова и повреждает пространство. Попробуйте его, если Вам нравится. И здесь это работает:
$ echo "GNU Linux is cool" | sed -r "s/([^ ]*)([ ]*)([^ ]*)/\3\2\1/"
Linux GNU is cool
А better/shorter/easier-to-read способ сделать это должно было бы уничтожить вторую группу и просто использовать литеральное пространство. Как так:
$ echo "GNU Linux is cool" | sed -r "s/([^ ]*) ([^ ]*)/\2 \1/"
Linux GNU is cool