2

如何在保持注释行不变的情况下替换/删除文件中的字符?我正在寻找具有以下几行效果的东西(其中'X'被替换为file.txt中的'Y'),只是快得多

while read line
do  
  if [[ ${line:0:1} = "#" ]]
  then
    echo "$line"
  else
    echo "$line" | tr "X" "Y"
  fi
done < file.txt

谢谢!

4

5 回答 5

4

与您的脚本相比,此 sed 命令等效、更准确(且更快):

sed '/^ *#/!{s/X/Y/g;}' file.txt

这意味着匹配行首没有0 or more spaces followed by #的任何行,并将 X 替换为 Y 全局。

于 2013-06-24T13:33:52.113 回答
1

我愿意打赌 perl 会比上面所有的都快:

 perl -i -pe 's/X/Y/g unless /^#/' file.txt
于 2013-06-24T21:05:12.537 回答
0

awk版本:

awk '!/^ *#/{gsub(/X/,"Y")}1' file.txt

一定要寻找单词边界以防止替换的子字符串被替换。例如,gawk你可以使用\<\>

于 2013-06-24T13:51:23.910 回答
0
sed -i '/^#/! s/{what_to_replace}/{to_what_to_replace}/g' file.txt
于 2013-06-24T13:38:14.460 回答
0

为了快速替换,使用sed,并且只替换以“#”开头的行:

 cat foo.txt | sed -e '/^#/! s/X/Y/g'
于 2013-06-24T13:35:53.603 回答