php 有没有办法防止sed添加回车符(^M)?

fquxozlt  于 2023-09-29  发布在  PHP
关注(0)|答案(4)|浏览(109)

我试图在WordPress的PHP文件中的define('WP_DEBUG', false);后添加define('WP_MEMORY_LIMIT', '96M');
以下是我到目前为止所尝试的:
1-

sed -b -i "/'WP_DEBUG', false);/a define('WP_MEMORY_LIMIT', '96M');" $full_path/wp-config.php;

2-

sed -i "s/'WP_DEBUG', false);/'WP_DEBUG', false);\ndefine('WP_MEMORY_LIMIT', '96M');/" $full_path/wp-config.php;

问题是,所有的新行都被这个回车符替换了。如何在特定行后添加新行而不会出现此问题?

define('WP_DEBUG', false);^M
define('WP_MEMORY_LIMIT', '96M');

Using sed(GNU sed)4.2.2,Ubuntu 16.04
以下是截图以澄清问题:

nszi6y05

nszi6y051#

该文件最初具有CRLF行结尾。当您在vim编辑器中打开它时,Vim会理解该文件具有CRLF结尾并对用户隐藏它们。通过编辑器添加的任何新行也将具有与文件其余部分相同的行结束符。
当您通过sed添加新行时,它具有LF行尾。下次在vim中打开它时,Vim会看到混合的行结尾,CRLFLF。然后vim决定将其解释为具有LF行结尾的文件。&所有CR字符都突出显示为^M
要测试,请尝试以下操作:

$ printf '%d\r\n' {1..5} > test_endings # This will create a file with CRLF endings.
$ file test_endings 
test_endings: ASCII text, with CRLF line terminators
$ vim test_endings
1
2
3
4
5
~
~
"test_endings" [dos] 5L, 15C        <~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Notice the word DOS here.

$ echo 6 >> test_endings # This will add line with LF line endings.
$ file test_endings 
test_endings: ASCII text, with CRLF, LF line terminators
$ vim test_endings
1^M
2^M
3^M
4^M
5^M
6
~
~
"test_endings" 6L, 17C

简而言之,问题不在于sed,而在于原始文件。

llew8vvj

llew8vvj2#

尝试将行尾从DOS格式转换为Unix:

sed 's/^M$//' $full_path/wp-config.php > $full_path/wp-config.php

更多方法:http://www.cyberciti.biz/faq/howto-unix-linux-convert-dos-newlines-cr-lf-unix-text-format/

pvcm50d1

pvcm50d13#

使用sed后,运行dos2unix转换为unix,它将删除“^M”。

sudo apt-get install dos2unix
sed -i "s/'WP_DEBUG', false);/'WP_DEBUG', false);\ndefine('WP_MEMORY_LIMIT', '96M');/" $full_path/wp-config.php;
dos2unix $full_path/wp-config.php
6kkfgxo0

6kkfgxo04#

已测试,无法复制。
该文件确实包含WordPress本身开始的windows行结束符。(参见the sample file)。
运行posted命令(编号2),结果为

define('WP_DEBUG', false);                                                      
define('WP_MEMORY_LIMIT', '96M');^M

这是预期的行为,虽然不是OP最初问题中的输出,但正是他们在屏幕截图中显示的结果。

相关问题