在多个文件中查找以文本开头并替换为小写字母的行
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)
我正在尝试查找包含以特定字符串开头的行的所有文件,然后将该行之后的所有内容设置为小写。我可以做我想做的部分事情,但似乎无法弄清楚如何让它全部发挥作用。
这是我要查找的字符串的示例:
_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)