使用 sed 在特定模式之间进行替换

使用 sed 在特定模式之间进行替换

sed我整个早上都在尝试使用和谷歌搜索,但我似乎无法让它发挥作用。

是否有可能sed小写两个特定字符之间的文本:

IE

SOMENAME=WOODSTOCK,
SOMEOTHERNAME=JIMMY,

我可以吗小写 WOODSTOCKJIMMY=(对伍德斯托克和吉米)他们在和之间的基础上,

答案1

GNU sed 可以实现这一点。根据替换的贪婪程度选择这两种形式中的一种。

sed 's|=.*,|\L&|' file
sed 's|=[^,]*,|\L&|' file

正如手册所述, “\L将替换内容转为小写,直到找到\Uor为止”。是正则表达式匹配的文本。\E&


我修改了示例文件,以表明您应该明智地在贪婪=.*,和非贪婪正则=[^,]*,表达式之间进行选择:

$ cat file
SOMENAME=WOODSTOCK,
SOMEOTHERNAME2=JIMMY,WOODSTOCK,FINISH
$ sed 's|=.*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,woodstock,FINISH
$ sed 's|=[^,]*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,WOODSTOCK,FINISH

答案2

在任何兼容 POSIX 的平台上awk,您可以使用该tolower()函数

awk -v FS='=' 'BEGIN { OFS = FS } { $2 = tolower($2) }1 ' file

使用该mktemp()函数创建一个临时文件来重定向上述命令的输出,然后重定向回原地保存。或者使用 GNU awk>= 4.1-i inplace

POSIX 兼容版本的另一个变体,使用match()函数可以做

awk 'match($0, /=([^,]*),/) { str = substr($0, RSTART+1, RLENGTH-2); sub(str, tolower(str)) }1'

相关内容