我正在尝试使用 sed 来替换每个实例老的在文件中新的。现在它适用于小写字符串,但我需要它来替换某些大写字符串。例如替换老的和新的。我知道 sed 可以做到这一点,但我不能完全正确地做到这一点?
for file in .; do
cat $file
sed 's/old/new/g' $file | tee $file
done
答案1
你知道命令的i
/I
标志s
(尽管是 GNU 扩展)吗?
答案2
要将“old”替换为“new”,将“OLD”替换为“NEW”,只需告诉 sed 执行这两项操作即可:
for file in ./*; do
cat "$file"
sed -i -e 's/old/new/g; s/OLD/NEW/g' "$file"
done
不要忘记引用变量,以防您有一个名为的文件some filename
(其中包含空格、换行符或制表符)。我还添加了-i
一个 GNU sed 扩展,因为您表示可以使用 GNU /i 标志扩展,告诉 sed 就地编辑文件,而不是依赖tee
和 缓冲区来完成它。
答案3
您可以使用 perl:
$ cat file
old news
OLD news
old Old oLD news
older news
$ perl -pe 's{(old)}{ ($tmp = $1) =~ tr/OLDold/NEWnew/; $tmp }ieg' file
new news
NEW news
new New nEW news
newer news
它使用s///
运算符进行搜索和替换,并且在替换中,它音译字符从“旧”到“新”,保留各个字符的大小写。这只有效,因为“旧”和“新”的字符串长度相同。
我需要使用临时变量,因为$1
它是只读值。
答案4
鉴于字符串大小相同,所有这些命令都将起作用:
<infile sed 'y/OLDold/NEWnew/' >outfile
<infile tr 'OLDold' 'NEWnew' >outfile
sed -i 'y/OLDold/NEWnew/' infile