С помощью KSH как преобразовать «12345» в «1.2.3.4.5?»

428
robin

С помощью KSH, если у меня есть строка, 12345и я хочу, чтобы она была преобразована в 1.2.3.4.5, как я могу это сделать?

Я пытался использовать, cutно это не так просто.

echo "12345" | cut -c1 
-1
Вы должны быть более конкретными. Что ты хочешь делать? Положить точку между каждой комбинацией двух цифр в переменной? Поставить точку между каждыми двумя символами в каждой строке файла? Поставить точку после первых четырех символов всех строк стандартного ввода, состоящих из неразделенных цифр? Так далее... SadBunny 8 лет назад 2
Можете ли вы отредактировать свой ответ, указав точный номер версии `ksh`, на котором вы пытаетесь это сделать? Вы упоминаете в комментарии, что это «ksh» в Solaris, но какова точная версия «ksh»? JakeGould 8 лет назад 0

4 ответа на вопрос

2
Caleb Xu

Обязательный awkответ:

echo "12345" | awk '$1=$1' FS= OFS="." 

Выход:

1.2.3.4.5 

Ответ изменен одним из решений в этом сообщении переполнения стека .

Хорошее `awk` решение. JakeGould 8 лет назад 0
Я попробовал это на Solaris и обнаружил, что я должен использовать nawk или / usr / xpg4 / bin / awk, в противном случае он возвращает сообщение об ошибке, как показано ниже. # echo "12345" | awk '$ 1 = $ 1' FS = OFS = "." awk: синтаксическая ошибка рядом со строкой 1 awk: выход из строя рядом со строкой 1 robin 8 лет назад 0
Тогда я попытался использовать # echo "12345" | / usr / xpg4 / bin / awk '$ 1 = $ 1' FS = OFS = ".", однако результат на 12345 отличается от ожидаемого 1.2.3.4.5 Можете ли вы посоветовать? Спасибо! robin 8 лет назад 0
Извините, я не знаю. Синтаксис Awk довольно привередлив между версиями. Удачи с `nawk`? Я обнаружил, что это работает на BSD `awk`, но не на GNU` awk`. Caleb Xu 8 лет назад 0
Тот же результат для Nawk. Собственно, я придумаю другой путь: эхо "1234" | sed 's / \ (. \ \) / \ 1./g'. Однако результатом является «1.2.3.4.» Я должен удалить последний. поэтому вся командная строка выглядит так: # temp_str = `echo" 1234 "| sed 's / \ (. \ \) / \ 1. / g'` # echo "$ " robin 8 лет назад 0
1
SadBunny

Perl regex (с поиском и обратными ссылками) отвечает, чтобы заменить все на «все плюс плюс точка», кроме последнего (при условии, что это был вопрос):

$ echo "12345" | perl -wlpe 's/(.(?=.))/$1\./g' 1.2.3.4.5 
Это здорово! Тем не менее, я хочу просто сделать это с помощью awk или seed robin 8 лет назад 0
0
fd0

A sed solution tested with ksh and /usr/bin/sed on OpenSolaris

echo "12345" | /usr/bin/sed -e 's/./&\./g' -e 's/\.$//' 
-1
JakeGould

Это должно работать. Протестировано в bashи kshв Mac OS X:

echo "12345" | sed 's/\(.\\)/\1./g' | rev | cut -c 2- | rev 

Выход:

1.2.3.4.5 

И разбивка команды выглядит так:

  • Это echoочевидно.
  • В sedрасщепляет строку в символах, а затем добавляют .между каждым символом.
  • rev переворачивает строку
  • cutвырезает строку в зависимости от положения символа; это 2связано с переводом строки, я верю.
  • rev запускается снова, чтобы вернуть обратную строку в исходном порядке.
Похоже, что Rev не работает на моем Solaris Ksh. Пока этот ответ дает мне некоторую подсказку и наконец я решил свою проблему. Пожалуйста, смотрите выше комментарии robin 8 лет назад 1

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