Пробелы полосы после единственных прописных букв с sed

Если Вы находитесь на Linux затем, можно обычно просто делать

ifconfig 

или

iwconfig

получить информацию о Вашем NIC. Для сканирования Вас обычно делают

iwlist wlan0 scan

получить информацию о точках беспроводного доступа в диапазоне. В этом случае Ваш беспроводной интерфейс был уже определен с помощью ifconfig (или iwconfig) как wlan0.

3
08.06.2012, 23:09
4 ответа

Я закончил тем просто, что использовал sed с каналами для получения оператора, который легок для меня понять:

echo O S D Settings | sed 's/\([A-Z][^ ]\)/_\1/g' | sed 's/ //g' | sed 's/_/ /g'

Все это делает замены пробелы, которые я не хочу с подчеркиванием, и затем удаляет их. Спасибо за все ответы!

1
27.01.2020, 21:10

Это заботится об именах как A B Chadwick и A B C D'Souza

Текст такой как A B cde и A B CDE не изменяются.

Это использует два временных нулевых символа \x00 для маркировки изменений (на имя) как, он прогрессирует через строку, удаляя пробелы.

:N и :S ответвление - к маркировкам (любое имя сделает),
t и b команды ветвления.
t ответвления по успешной замене в предыдущем s/../../ команда.
b ответвления безусловно.

sed -r ":N                                                # loop per name
         /(\<[A-Z]\> )+[A-Z][a-z']/{                      # line needs action
             s/((\<[A-Z]\> )+)([A-Z][a-z'])/\x00\1\x00\3/ # add \x00 markers
            :S                                            # loop per space
             s/(\x00[A-Z]+) (\<[A-Z]\>)/\1\2/             # delete a space
             t S                                          # any more spaces? 
             b N                                          # any more names?
         }; s/\x00//g"                                    # remove \x00
4
27.01.2020, 21:10

Это хитро с sed, но если perl хорошо, можно сделать это этот путь

echo O S D Settings | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'

Это твердо в sed потому что это не поддерживает предварительные утверждения.

Тесты:

echo O S D | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D Settings | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D. | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo One O DDE T. S Asdf Q R Tee | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D\  | perl -p -e 's/([A-Z]) (?=.([^\w]|$))/$1/g'

Если Вы хотите неаккуратное решение с sed, попробовать

echo O S D Settings | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'

Который работает на Ваш образец, но перестанет работать для других случаев.

Тесты:

echo O S D | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D Settings | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D. | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo One O DDE T. S Asdf Q R Tee | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D\  | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
3
27.01.2020, 21:10
  • 1
    Не Может использовать жемчуг. Но спасибо за полный ответ так или иначе –  SSumner 11.06.2012, 17:17

Это могло бы работать на Вас:

echo "O S D Settings and B T W and A B C D'Souza too F Y I" |
sed ':a;s/\(\<[[:upper:]]\>\) \(\<[[:upper:]]\>\([^'\'']\|$\)\)/\1\n\2/g;ta;s/\n//g'
OSD Settings and BTW and ABC D'Souza too FYI

Объяснение:

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

2
27.01.2020, 21:10
  • 1
    , я уже нашел свой ответ прежде, чем видеть Ваш и мой легче для меня понять. Спасибо так или иначе –  SSumner 11.06.2012, 17:20

Теги

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