Помощь по команде 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
задан 16.05.2020, 09:39

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'

, привязки к слову, будет казаться, не будут необходимы вообще, если Вы изменитесь * (нуль или больше) к [1 110] (один или несколько)

echo 'GNU Linux is cool'| sed -re 's/([^ ]+)([ ]+)([^ ]+)/\3\2\1/g'
Linux GNU cool is
3
ответ дан 16.05.2020, 09:40
  • 1
    спасибо steeldriver, это решает мою проблему. BTW, какой-либо другой случай я должен использовать Escape обратной косой черты? – Tomasz Gandor 16.05.2020, 09:40
  • 2
    @terdon извините, я забыл. – ixe013 16.05.2020, 09:40

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

  • Вам нужен расширенный режим на для этих соответствий (-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
1
ответ дан 16.05.2020, 09:40

Теги

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