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

Find lines in multiple files starting with text, and replacing with lowercase

我正在尝试查找包含以特定字符串开头的行的所有文件,然后将该行之后的所有内容设置为小写。我可以做我想做的部分事情,但似乎无法弄清楚如何让它全部发挥作用。

这是我要查找的字符串的示例:

      _assetBundleName: SomeDirectory/ChildDirectory

我需要它是:

      _assetBundleName: somedirectory/childdirectory

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

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

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

sed -E 's/(_assetBundleName:)(.*)/\L/' file

\L 将仅小写第二个捕获组内容。


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

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

使用sed

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

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

输出

 _assetBundleName: somedirectory/childdirectory

Perl 解决方案:

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

Perl one-liner 使用这些命令行标志:
-e :告诉 Perl 查找代码 in-line,而不是在文件中。
-p :一次循环输入一行,默认情况下将其分配给 $_ 。在每次循环迭代后添加 print $_
-i:编辑输入文件in-place(覆盖输入文件)。
-i.bak:编辑输入文件in-place(覆盖输入文件)。覆盖之前,通过在其名称后附加扩展名 .bak.

来保存原始文件的备份副本

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

另见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perlre: Perl regular expressions (regexes)