Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
Linux 使用sed执行替换时丢失制表符和换行符_Linux_Bash_Replace_Sed - Fatal编程技术网

Linux 使用sed执行替换时丢失制表符和换行符

Linux 使用sed执行替换时丢失制表符和换行符,linux,bash,replace,sed,Linux,Bash,Replace,Sed,我需要将shell命令中的-Xmx1024m(将1024更改为2048)替换为standalone.conf 我尝试使用sed: echo $(sed 's/1024/2048/g' standalone.conf) > standalone.conf. 代码可以工作,但保存的文本会丢失制表符和换行符。将扩展传递给echounquoted会使其进行字符串拆分和全局扩展,将这些过程生成的每个单词作为单独的参数传递给echo(这echo然后在每个单词之间加上一个空格) 相反,请考虑: sed

我需要将shell命令中的
-Xmx1024m
(将
1024
更改为
2048
)替换为
standalone.conf

我尝试使用
sed

echo $(sed 's/1024/2048/g' standalone.conf) > standalone.conf.

代码可以工作,但保存的文本会丢失制表符和换行符。

将扩展传递给
echo
unquoted会使其进行字符串拆分和全局扩展,将这些过程生成的每个单词作为单独的参数传递给
echo
(这
echo
然后在每个单词之间加上一个空格)

相反,请考虑:

sed 's/1024/2048/g' <standalone.conf >standalone.conf.new && mv standalone.conf{.new,}
sed's/1024/2048/g'standalone.conf.new&&mv standalone.conf{.new,}

…而且,一般来说,总是使用
echo“$foo”
或代替
echo$foo
——这里缺少引号是导致错误的最直接原因。

不要使用echo,但让sed更改文件:

sed -i 's/1024/2048/g' standalone.conf

sed's/1024/2048/g'
将在整个文件中全局转换1024到2048,这可能是不明智的。最好是以某种方式限制翻译。如果您的目标实际上就是您所说的,即将-Xmx1024m更改为-Xmx2048m,那么以下内容至少是一个合理的开始(假设您的sed支持-i选项):

(如果您的sed不支持-i,则进行明显的更改。)

如果文件的时间戳很有用,并且如果您只想在需要更新时更新文件,请考虑:

grep -q -e -Xmx1024m standalone.conf && sed -i -e 's/-Xmx1024m/-Xmx2048m/' standalone.conf

给定的代码不会有这种效果。假设您也在做其他事情(可能涉及将内容加载到变量中,并使用
echo$varname
打印它)…一般来说,在提问时,测试您是否包含了足够的代码来精确地再现手头的问题是很有用的。对不起,现在我明白了。。。这是因为它实际上不可靠,输入和输出的文件名都相同;它可以在读取原始内容之前覆盖输出文件…顺便说一句,与其说是echo本身,不如说是作为echo参数使用的无引号扩展
echo“$(…)”
不会有同样的效果,尽管还会有其他bug。这是不可移植的:
-i
根本不是由POSIX指定的,而且,许多BSD实现都强制使用
-i
的扩展参数,这意味着许多版本即使支持
-i
,也会因这种用法而失败。正如我向Walter指出的那样,
sed-i
是不可移植的;参见POSIX sed规范,网址:;即使在支持
sed-i
的平台上,您在这里给出的确切用法也可能失败——在OS X上尝试一下。POSIX确实提供了保证支持就地编辑功能的编辑器;
ed
ex
都属于这一类,但是
sed
是一个流编辑器,而不是一个文件编辑器。@charlesduffy-I说“合理的开始”主要是因为-I问题,但已经澄清了。我添加了-e以确保它与OSX(BSD)一起工作。谢谢
grep -q -e -Xmx1024m standalone.conf && sed -i -e 's/-Xmx1024m/-Xmx2048m/' standalone.conf