2013-08-22 130 views
1

我尝试使用到SED答案写这个问题Edit a file using sed/awk大写:替换字符串,如果第一个字母使用SED

sed -e 's/^[A-Z]/$:$&/' file.txt 

但结果是:

wednesday 
$:$Weekday 

$:$thursday 
$:$Weekday 

$:$friday 
$:$Weekday 

$:$saturday 
$:$MaybeNot 

$:$sunday 
$:$MaybeNot 

$:$monday 
$:$Weekday 

$:$tuesday 
$:$Weekday 

为什么更换,如果第一个字符是小写?

+0

我无法重现该问题。你确定你没有添加一个不区分大小写的选项吗? – Barmar

+0

@Barmar不,我使用确切的命令,但我使用cygwin。 – jcubic

+1

它在Linux和OS X上正常工作。听起来像是Cygwin版本的sed问题。 – Barmar

回答

1

这是根据this bug report根据区域中意外字符排序引起的“特征”,进一步解释为herehere

$ locale 
LANG=en_GB.UTF-8 
LC_CTYPE="en_GB.UTF-8" 
LC_NUMERIC="en_GB.UTF-8" 
LC_TIME="en_GB.UTF-8" 
LC_COLLATE="en_GB.UTF-8" 
LC_MONETARY="en_GB.UTF-8" 
LC_MESSAGES="en_GB.UTF-8" 
LC_ALL= 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | sed -e 's/[A-Z]/./g' 
..........................a......................... 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | sed -e 's/[a-z]/./g' 
.........................Z.......................... 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | LC_ALL=C sed -e 's/[A-Z]/./g' 
..........................abcdefghijklmnopqrstuvwxyz 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | LC_ALL=C sed -e 's/[a-z]/./g' 
ABCDEFGHIJKLMNOPQRSTUVWXYZ.......................... 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | sed -e 's/[[:upper:]]/./g' 
..........................abcdefghijklmnopqrstuvwxyz 

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | sed -e 's/[[:lower:]]/./g' 
ABCDEFGHIJKLMNOPQRSTUVWXYZ.......................... 

$ sed --version 
GNU sed version 4.2.1 
+0

@Thor:在Linux上,它的问题是关于Cygwin环境(请参阅标签)。 –

+0

更新了我的答案,并附有解释此(“正确”)范围行为的链接。 –