sed 替换小写和大写字符串

sed 替换小写和大写字符串

我正在尝试使用 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

相关内容