我试图弄清楚如何用“.”替换日期(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/99999
为1000.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'