我试图找到所有包含以特定字符串开头的行的文件,然后将该行中的所有内容设置为小写。我可以做我想做的部分事情,但似乎不知道如何让这一切发挥作用。
下面是我要找的字符串的一个例子:
_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)