awk sed if 语句

G.A*_*met 9 sed awk text-processing

我试图在开头添加 0,如果有“。” 在该行的第二个字符处。我无法将这两者结合起来;

awk '{ print substr( $0, 2, 1 ) }' file.txt 
Run Code Online (Sandbox Code Playgroud)

显示第二个字符

sed -ie "s/.\{0\}/0/" file.txt
Run Code Online (Sandbox Code Playgroud)

在开头添加一个零。

应该有一个“如果第二个字符是一个点”。

示例文件:

1.02.2017 23:40:00
10.02.2017 23:40:00
Run Code Online (Sandbox Code Playgroud)

最终的:

01.02.2017 23:40:00
10.02.2017 23:40:00
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 13

我们可以使用sedawk来完全解决问题。


sed

$ sed 's/^.\./0&/' file.txt
Run Code Online (Sandbox Code Playgroud)

&出现在替换命令(s)的替换部分时,将扩展到与命令模式部分匹配的输入行部分。

正则表达式的^.\.意思是“匹配所有以 ( ^)开头的行,任意字符 ( .) 后跟文字点 ( \.) ”。

如果该行是1.02.2017 23:40:00,则该模式将匹配,并在该行的开头1.被替换01.


awk

基于问题中的部分awk代码...

如前所述,这将打印每行输入的第二个字符:

$ awk '{ print substr($0, 2, 1) }' file.txt
Run Code Online (Sandbox Code Playgroud)

我们可以使用substr($0, 2, 1)返回第二个字符的事实并将其用作条件:

$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Run Code Online (Sandbox Code Playgroud)

进入的{ ... }是在前面的代码$0,它是当前行的内容,如果前面的条件为真,则为零:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Run Code Online (Sandbox Code Playgroud)

然后我们只需要确保打印所有行:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Run Code Online (Sandbox Code Playgroud)

条件substr($0, 2, 1) == "."当然也可以更改为正则表达式(我们使用的表达式与我们在sed解决方案中使用的表达式完全相同):

$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Run Code Online (Sandbox Code Playgroud)

一些认为“越短越好”的人会这样写

$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
Run Code Online (Sandbox Code Playgroud)

(大概也去除大部分的空间:awk '/^.\./{$0="0"$0}1' file.txt


ilk*_*chu 5

使用 sed:

sed -e "/^.\./s/^/0/" file.txt 
Run Code Online (Sandbox Code Playgroud)

该模式/^.\./在 line 的开头查找任何字符和文字点^,如果匹配,s则用零替换该行的开头,有效地将零添加到开头。

sed 表达式s/.\{0\}/0/有点奇怪,它匹配零个或多个副本并用零替换。该模式当然会匹配字符串的每个位置,但由于s///仅替换第一个匹配项,因此它按您的预期工作。不过,这是一种古怪的方法。


或者使用 awk,类似的正则表达式可以匹配该行,但我们可以使用substr

awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 
Run Code Online (Sandbox Code Playgroud)

我们首先测试第二个字符是否是一个点,如果是,则在该行的前面添加一个零。最后一个调用在任何修改后打印行的默认操作。


Eri*_*ouf 1

使用 sed 可能是

sed 's/^\(.\)\.\(.*\)/0\1.\2/'
Run Code Online (Sandbox Code Playgroud)

这将用于^锚定到行的开头,然后捕获组中的任何单个字符,后跟文字.,然后是其他任何内容。如果我们匹配,我们打印 a 0,然后打印我们的第一个捕获组(行开头的字符),然后打印 a.然后我们的第二个捕获组(行的其余部分)