如何替换 OS X 上文件夹内所有 .php 文件中的字符?

如何替换 OS X 上文件夹内所有 .php 文件中的字符?

我需要替换以下字符:

à 与一个

â 与

î 与我

ř 与 s

ś 与 t

替换必须区分大小写。例如,如果字母是大写字母,则必须将其替换为大写字母。

我读过可以用于sed此过程,但我不知道如何使用它。任何人都可以帮助我编写我必须在终端中运行的确切命令吗?

答案1

尽管sed通常用于这些类型的任务,但它实际上并不是为这些任务而设计的——它的名字是溪流编辑。

该工具专为非交互式设计文件编辑是ex. (vi是“可视化编辑器”形式ex。)特别是当您想要就地编辑文件时,ex它是一种比sed.

在这种情况下,使用的命令几乎与sed前面给出的命令相同,但并非必须如此。以下内容符合 POSIX 标准(与 不同sed -i)。

for file in *.php; do ex -sc '%s/[ăâ]/a/ge | %s/ș/s/ge | %s/ț/t/ge | %s/î/i/ge | x' "$file" ; done

解释:

-s启动“静默模式”以准备批处理。 -c指定要执行的命令。

%意味着将以下命令应用于文件中的每一行。这些s///命令是相当不言自明的;e末尾的标志意味着任何错误(由于未找到模式)都将被抑制并且文件处理将继续。

|是命令分隔符(不是管道)。

x告诉ex将任何更改写入文件(但前提是存在更改)并退出。


如果您想要就地文件编辑,ex这是首选工具。如果您想在进行更改之前预览更改,我建议您按照@gardenhead的建议使用tr

(当然,如果您使用适当的版本控制系统(例如 git),您可以使用 进行适当的更改ex,并通过运行将文件与旧版本进行比较git diff。)

答案2

sedtr会起作用,但是使用 翻译字符要简单得多。

for file in *.php; do tr 'ăâîșțĂÂÎȘȚ' 'aaistaaist' < "${file}" > "translated_${file}"

等效sed的(在 GNU 系统上需要,而不是tr不支持多字节字符的 OS/X)是:

sed 'y/ăâîșțĂÂÎȘȚ/aaistaaist/'

答案3

您可以使用公式替换字符sed s/old_string/new_string/

来自联机帮助页:

sed - stream editor for filtering and transforming text

s/regexp/replacement/
              Attempt to match regexp against the pattern space.  If successful, replace that  portion  matched  with
              replacement.   The replacement may contain the special character & to refer to that portion of the pat‐
              tern space which matched, and the special escapes \1 through \9 to refer to the corresponding  matching
              sub-expressions in the regexp.

如果您有一组要替换的字符,那么我建议创建replace.sed包含替换定义的文件(例如),如下所示:

$ cat replace.sed
s/ă/a/g
s/â/a/g
s/î/i/g
s/ș/s/g
s/ț/t/g

然后运行就可以执行如下:

  • sed -f replace.sed < old.php > new.php

    将指定的字符替换为replace.sed新的字符old.php并输出到new.php

  • sed -i -f replace.sed file.php

    哪个替换file.php同时替换指定的字符replace.sed

    来自联机帮助页:

    -i[SUFFIX], --in-place[=SUFFIX]
    
                  edit files in place (makes backup if SUFFIX supplied)
    

或者您可以在一行中同时定义:

sed -e 's/ă/a/g' -e 's/â/a/g' -e 's/î/i/g' -e 's/ș/s/g' -e 's/ț/t/g'

要对所有文件执行此操作.php,您可以使用类似以下内容的命令:

  • find . -name "*.php" -exec sed -i '' -f replace.sed '{}' \;
  • for i in *.php; do sed -i '' -f replace.sed "$i"; done

注意:使用-maxdepth 1withfind来限制*.php仅在当前目录中定位。访问man sed了解更多信息。

答案4

如果你更喜欢 GUI 工具,你可以尝试j编辑。它具有出色的搜索和替换功能,包括文件夹(目录)搜索。如果您愿意,可以使用正则表达式。超级搜索会弹出一个包含结果的单独窗口。

j编辑搜索

相关内容