awk sed if 语句

awk sed if 语句

我试图在开头添加 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.然后我们的第二个捕获组(行的其余部分)

相关内容