我怎样才能用 .在使用 sed 的文件中

我怎样才能用 .在使用 sed 的文件中

我试图弄清楚如何用“.”替换日期(20/01/1990)中的“/” (1990 年 1 月 20 日)。我确实明白整个文件是's/\//./g',但是文件中有 url,因此它将那些 '/' 替换为 '.'这不是我需要的。有没有办法让它只适用于某些列?我说有一种方法可以使用 perl 但我正在 bash 中工作

答案1

只需使用不属于您的行的不同分隔符即可。

echo 'http://www.google.com  (20/01/1990)' | sed -r 's@([0-9]+)/([0-9]+)/([0-9]+)@\1.\2.\3@g'
http://www.google.com  (20.01.1990)

答案2

bash是一个shell,一个命令行解释器。它的作用是运行命令。sed和是任何其他 shell 可以运行的perl两个命令。bash

两者恰好都是某种编程语言的解释器,但这与这里无关。两者都擅长文本处理,因为它们就是为此而设计的。sed是一个标准命令,但有许多不同的实现,如果超出 POSIX 指定的范围,这些实现是不兼容perl的,不是,但只有一种实现(尽管许多不同的版本具有不同的功能级别)。

在这里,使用标准sed语法,您可以执行以下操作:

sed 's|\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)|\1.\2.\3|g'

无论实现如何,sed只要它在 POSIX 指定的限制内符合 POSIX 标准(在这种情况下,只要输入是有效文本,实际上不包括很长的行、不形成有效字符的字节序列或非分隔符),它都应该起作用行,尽管某些实现(例如 GNU)sed可能接受这些作为扩展)。

对于任何版本perl和任何输入,您也可以编写它:

perl -pe 's|(\d\d)/(\d\d)/(\d{4})|$1.$2.$3|g'

或者使用最新版本或perl

perl -pe 's{\d\d/\d\d/\d{4}}{$&=~y|/|.|r}ge'

如果您想避免替换1000/10/999991000.10.99999,可以使用 中可用的字边界运算符perl,但标准中不可用sed(尽管某些实现支持\</\>[[:<:]]/[[:>:]]作为扩展):

perl -pe 's|\b(\d\d)/(\d\d)/(\d{4})\b|$1.$2.$3|g'

或者环视四周运算符(同样是正则表达式的一个功能perl,但不是标准 sed 正则表达式)。

perl -pe 's|(?<!\d)(\d\d)/(\d\d)/(\d{4})(?!\d)|$1.$2.$3|g'

你可以做一些与标准相当的sed事情编程(sed的条件循环结构):

sed -e :1 -e 's|^\(.*[^[:digit:]]\)\{0,1\}\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)\([^[:digit:]].*\)\{0,1\}$|\1\2.\3.\4\5|g; t1'

相关内容