在多个文件中查找以文本开头并替换为小写的行



我试图找到所有包含以特定字符串开头的行的文件,然后将该行中的所有内容设置为小写。我可以做我想做的部分事情,但似乎不知道如何让这一切发挥作用。

下面是我要找的字符串的一个例子:

_assetBundleName: SomeDirectory/ChildDirectory

我需要它:

_assetBundleName: somedirectory/childdirectory

因此,我无法将整行转换为小写,只能将我要查找的字符串(即_assetBundleName:)之后的所有内容转换为小写。我需要在许多文件(运行命令的所有目录和子目录)上执行此操作。

sed 's/[a-z]/L&/g'将所有内容都转换为小写,而不仅仅是我找到的字符串之后的所有内容。

您可以将此gnu-sed与两个捕获组一起使用:

sed -E 's/(_assetBundleName:)(.*)/1L2/' file

L2将仅使第二捕获组内容小写。


如上所述,这需要gnu-sed。如果你没有,那么你可以使用这个awk命令:

awk 'BEGIN {FS=OFS=":"} 
$1 ~ /_assetBundleName/ {$2 = tolower($2)} 1' file

使用sed

$ sed '/_assetBundleName:/s/:.*/L&/' input_file

$ sed "/_assetBundleName:/s/(.*)(:.*)/echo '1'$(echo \2 | tr 'A-Z' 'a-z')/" file | bash

输出

_assetBundleName: somedirectory/childdirectory

Perl解决方案:

perl -i -pe 's{(_assetBundleName:)(.*)}{$1L$2}' file1 file2 ...

Perl单行使用以下命令行标志:
-e:neneneba告诉Perl在线查找代码,而不是在文件中查找代码
-p:一次循环输入一行,默认情况下将其分配给$_。在每次循环迭代后添加print $_
-i:就地编辑输入文件(覆盖输入文件)
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在原始文件的名称后附加扩展名.bak来保存原始文件的备份副本。

s{PATTERN}{REPLACEMENT}:将PATTERN替换为REPLACEMENT
.*:任意字符,重复0次以上
$1, $2:第一个和第二个捕获组,用括号捕获
L$2:将第二个捕获组中的所有内容小写。

另请参阅:
perldoc perlrun:如何执行Perl解释器:命令行开关
perldoc perlre:Perl正则表达式(regex)

最新更新