我试图在开头添加 0,如果有一个“。”在该行的第二个字符处。我无法将这两者结合起来;
awk '{ print substr( $0, 2, 1 ) }' file.txt
显示第二个字符
sed -ie "s/.\{0\}/0/" file.txt
在开头加一个零。
应该有一个“如果第二个字符是点”。
样本文件:
1.02.2017 23:40:00
10.02.2017 23:40:00
最终的:
01.02.2017 23:40:00
10.02.2017 23:40:00
答案1
我们可以使用sed
或中的任何一个awk
来彻底解决问题。
和sed
:
$ sed 's/^.\./0&/' file.txt
当&
出现在替换命令 ( s
) 的替换部分时,它将扩展到输入行中与命令的模式部分匹配的部分。
正则表达式的^.\.
意思是“匹配所有以 ( ^
) 开头、任意字符 ( .
) 后跟文字点 ( \.
) 的行”。
如果该行是1.02.2017 23:40:00
,则该模式将匹配,并将在该行的开头1.
替换为。01.
和awk
:
基于awk
问题中的部分代码......
如上所述,这将打印每行输入的第二个字符:
$ awk '{ print substr($0, 2, 1) }' file.txt
我们可以使用返回第二个字符的事实substr($0, 2, 1)
并将其用作条件:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
如果前面的条件为真,则进入的是在当前行的内容前面加上零的{ ... }
代码:$0
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
然后我们只需要确保打印所有行:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
当然,条件substr($0, 2, 1) == "."
也可以更改为正则表达式(我们使用与sed
解决方案中使用的表达式完全相同的表达式):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
一些认为“越短越好”的人会这样写:
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(并且可能还删除了大部分空格awk '/^.\./{$0="0"$0}1' file.txt
:)
答案2
使用 sed:
sed -e "/^.\./s/^/0/" file.txt
该模式/^.\./
在 line 开头查找任何字符和文字点^
,如果匹配,则s
用零替换该行开头,从而有效地将零添加到开头。
sed 表达式s/.\{0\}/0/
有点奇怪,它匹配任何内容的零个或多个副本并用零替换。该模式当然会匹配字符串的每个位置,但由于s///
仅替换第一个匹配项,因此它会按您的预期工作。不过,这是一种奇怪的方法。
或者使用 awk,类似的正则表达式可以匹配该行,但我们可以使用substr
:
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
我们首先测试第二个字符是否是点,如果是,则在该行的前面添加一个零。最后一个调用在任何修改后打印该行的默认操作。
答案3
您说的是 awk 和 sed,但您似乎正在尝试格式化日期,为此我将使用该date
命令。例如:
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
将输出
01.02.2017 23:40:00
sed
中间的命令将句点更改为斜杠以输入到中date -d
。格式选项允许以几乎任何您想要的格式输出。特别是%m
将对月份进行零填充,这似乎是您想要做的。
正如库萨拉南达指出的:
更加紧凑(GNU date 和 Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
答案4
使用 sed 可能是
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
这将用于^
锚定到行的开头,然后捕获组中的任何单个字符,后跟文字.
,然后是其他任何内容。如果我们匹配,我们打印 a 0
,然后打印我们的第一个捕获组(行开头的字符),然后打印 a.
然后我们的第二个捕获组(行的其余部分)