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
我们可以使用sed或awk来完全解决问题。
与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)
使用 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)
我们首先测试第二个字符是否是一个点,如果是,则在该行的前面添加一个零。最后一个调用在任何修改后打印行的默认操作。
使用 sed 可能是
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
Run Code Online (Sandbox Code Playgroud)
这将用于^锚定到行的开头,然后捕获组中的任何单个字符,后跟文字.,然后是其他任何内容。如果我们匹配,我们打印 a 0,然后打印我们的第一个捕获组(行开头的字符),然后打印 a.然后我们的第二个捕获组(行的其余部分)