Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 忽略注释行替换文件中字符的快速方法_Bash_Shell_Scripting - Fatal编程技术网

Bash 忽略注释行替换文件中字符的快速方法

Bash 忽略注释行替换文件中字符的快速方法,bash,shell,scripting,Bash,Shell,Scripting,如何在保留注释行不变的情况下替换/删除文件中的字符?我正在寻找一个具有以下行效果的东西(其中file.txt中的“X”替换为“Y”),只是速度要快得多: 读取行时 做 如果[${line:0:1}=“#”]] 然后 回音“$line” 其他的 回音“$line”| tr“X”Y fi 完成

如何在保留注释行不变的情况下替换/删除文件中的字符?我正在寻找一个具有以下行效果的东西(其中file.txt中的“X”替换为“Y”),只是速度要快得多:

读取行时
做
如果[${line:0:1}=“#”]]
然后
回音“$line”
其他的
回音“$line”| tr“X”Y
fi
完成
谢谢大家!

与脚本相比,此sed命令更准确(更快):

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

这意味着匹配任何在行首没有
0或更多空格且后跟#
的行,并将X全局替换为Y。

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


awk
版本:

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

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

我敢打赌perl将比上述所有方法更快:

 perl -i -pe 's/X/Y/g unless /^#/' file.txt

; 无用地使用
-e
。如果注释行在
#
之前几乎没有前导空格会怎么样?@devnull在示例中,我更喜欢无用地使用cat,因为它更好地展示了如何将代码插入管道链中。如果数据确实存在于文件中,并且
sed
确实是必须应用的唯一过滤器,那么您显然应该将该文件交给
sed
。我看不出无用的
-e
有什么害处。在示例中,您更愿意向新手介绍不相关的选项?在本例中,您更愿意通过引入UOOC来添加
|
,从而使这些内容看起来更复杂?@l0b0:我知道这一点(并且在我在回答之前2分钟提交的答案中使用了这一点)。我指的是这个具体的答案,因为这并不能解决这个问题。谢谢你的回答。在我的例子中,它大约比读行结构快30倍。谢谢,但是在我的例子中(从注释文件中删除两个字符),你的awk解决方案比读行脚本花费的时间更长;基于sed的解决方案至少快50倍!在我的测试中,它大约与sed替换一样快,但没有明显更快。
sed -i '/^#/! s/{what_to_replace}/{to_what_to_replace}/g' file.txt
awk '!/^ *#/{gsub(/X/,"Y")}1' file.txt
 perl -i -pe 's/X/Y/g unless /^#/' file.txt