Помощь по команде sed

Учебник 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. Большое спасибо.

1
задан 15 March 2014 в 14:06

2 ответа

Это может просто быть проблема с форматированием форума, но < и > по-видимому, предназначаются, чтобы быть привязками к слову и 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'

Привязки к слову, казалось бы, не были бы необходимы вообще, если Вы изменяетесь * (нуль или больше) к + (один или несколько)

echo 'GNU Linux is cool'| sed -re 's/([^ ]+)([ ]+)([^ ]+)/\3\2\1/g'
Linux GNU cool is
3
ответ дан 15 March 2014 в 14:06

Хорошо я не знаю. Здесь было несколько проблем:

  • Вам нужен расширенный режим на для этих соответствий (-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
0
ответ дан 15 March 2014 в 14:06

Другие вопросы по тегам:

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