我需要替换以下字符:
à 与一个
â 与
î 与我
ř 与 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
sed
tr
会起作用,但是使用 翻译字符要简单得多。
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 1
withfind
来限制*.php
仅在当前目录中定位。访问man sed
了解更多信息。
答案4
如果你更喜欢 GUI 工具,你可以尝试j编辑。它具有出色的搜索和替换功能,包括文件夹(目录)搜索。如果您愿意,可以使用正则表达式。超级搜索会弹出一个包含结果的单独窗口。