Скрипты Bash: использование sed и cut для вывода определенного формата - PullRequest
0 голосов
/ 14 мая 2011

Я работаю над сценарием bash, используя sed и cut, которые потребуют ввод времени разными способами и выводят их в определенном формате.Вот пример строки:

timeinhour=$(cut -d" " -f2<<<"$line" | sed 's/p/ /'  | sed 's/a/ /' | sed 's/am/ /' | sed 's/pm/ /' | sed 's/AM/ /' | sed 's/PM/ /' )

Как вы можете видеть, я просто удаляю любые конечные am или pm из записи времени, которая может быть отформатирована различными способами, оставляя только цифры.

Поэтому я хочу, чтобы эта строка просто показывала время суток (timeinhour), то есть «1000AM» = «10», как «10a» и «10am».

Проблема, с которой я сталкиваюсь, заключается вразличная продолжительность записей времени.Если я скажу sed или cut удалить последние два символа, «1000» будет правильно выводить нужный мне час: «10», но использование его на том, который уже равен «10», очевидно, приведет к пустому выводу.

Я экспериментировал с такой строкой

sed 's/\(.*\)../\1/'

Если у кого-нибудь есть какой-либо совет, я был бы признателен.

Например, этот ввод:

1p
1032AM
419pm
1202a

будет производить:

1
10
4
12

Ответы [ 2 ]

2 голосов
/ 14 мая 2011
sed 's/[^0-9]//g;s/^[0-9]\{1,2\}$/&00/;s/^\(.*\)..$/\1/'

шаги

1p    -> 1    ->  100 -> 1
10a   -> 10   -> 1000 -> 10
419pm -> 419  ->  419 -> 4
1202a -> 1202 -> 1202 -> 12
  • удалить то, что не число
  • развернуть 1 или 2 цифры (часы) в 4 цифры ЧЧмм
  • игнорироватьпоследние две буквы (минуты)
0 голосов
/ 14 мая 2011

Попробуйте:

timeinhour=$(cut -d" " -f2<<<"$line" | sed 's/p/ /;s/a/ /;s/am/ /;s/pm/ /;s/AM/ /;s/PM/ /' | sed 's/\(.*\)../\1/' # Using your example.
...