Answers:
我们可以使用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
所涉及的是{ ... }
prepens的代码$0
,即当前行的内容,如果上述条件为true,则为零:
$ 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
)
sed 's/^.\./0&/' file.txt
。我认为您应该将其放在答案的开头。不过,+ 1。
与sed:
sed -e "/^.\./s/^/0/" file.txt
模式/^.\./
将在行的开头查找任何字符和文字点^
,如果匹配,s
则用零代替该行的开头,从而有效地将零添加到开头。
sed expressoin s/.\{0\}/0/
有点奇怪,它匹配零个或多个副本,并替换为零。该模式当然会在字符串的每个位置都匹配,但是由于s///
仅替换了第一个匹配项,因此它可以按预期工作。不过,这是一种古朴的方法。
或者使用awk,类似的正则表达式可以匹配该行,但是我们可以使用substr
:
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
我们首先测试第二个字符是否为点,然后将零添加到该行的开头。最后一个调用任何修改后的默认行为,即打印该行。
您说了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
特别意志零垫的一个月,这是它好像你正在尝试做的。
正如Kusalananda指出的那样:
更紧凑(GNU日期和Bash): date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
s|\.|/|g
。否则,如上所述:不错,+ 1
使用sed可能是
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
这将用于^
锚定到行的开头,然后捕获组中的任何单个字符,然后捕获文字,然后捕获其他任何字符.
。如果匹配,则打印0
,然后是第一个捕获组(行首的字符),然后是.
第二个捕获组(行的其余部分)
&
是你的朋友。参见Kusalananda的sed示例。
sed
可能在其他情况下有用,而不仅仅是这个特定问题