【问题标题】:Bash scripting: using sed and cut to output a specific formatBash 脚本:使用 sed 和 cut 输出特定格式
【发布时间】:2011-05-15 03:11:58
【问题描述】:

我正在使用 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/ /' )

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

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

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

我一直在尝试这样的一行

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

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

例如这个输入:

1p
1032AM
419pm
1202a

会产生:

1
10
4
12

【问题讨论】:

  • 很抱歉。显示的特定行的输入将是时间,可能以各种格式编写。示例输入:1p 1032AM 419pm 1202a。输出将只是一天中的一个小时。输入=输出组合示例:1p=1 1032AM=10 419pm=4 1202a=12
  • @mu 太短:这就是他的意思。

标签: bash sed cut


【解决方案1】:
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
  • 忽略最后两个字符(分钟)

【讨论】:

  • 像魅力一样工作!也感谢您的解释。
【解决方案2】:

试试:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多