0

我正在使用 sed 和 cut 编写一个 bash 脚本,该脚本将花费时间以各种方式输入并以特定格式输出它们。这是一个示例行:

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

如您所见,我只是从可能以各种方式格式化的时间条目中删除任何尾随的上午或下午,只留下数字。

所以我希望这条线只是吐出一天中的小时(timeinhour),即“1000AM”=“10”,“10a”和“10am”也是如此。

我遇到的问题是时间条目的长度不同。如果我告诉 sed 或 cut 删除最后两个字符,“1000”将正确输出我需要的小时:“10”,但在已经是“10”的字符上使用它显然会导致空白输出。

我一直在尝试这样的一条线

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

如果有人有任何建议,我将不胜感激。

例如,这个输入:

1p
1032AM
419pm
1202a

会产生:

1
10
4
12
4

2 回答 2

2
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 位数 HHmm
  • 忽略最后两个字符(分钟)
于 2011-05-14T17:49:31.933 回答
0

尝试:

timeinhour=$(cut -d" " -f2<<<"$line" | sed 's/p/ /;s/a/ /;s/am/ /;s/pm/ /;s/AM/ /;s/PM/ /' | sed 's/\(.*\)../\1/' # Using your example.
于 2011-05-14T17:43:09.883 回答