【问题标题】:Is there a way to prevent sed from adding carriage return (^M)?有没有办法防止 sed 添加回车符(^M)?
【发布时间】:2016-10-17 16:35:23
【问题描述】:

我正在尝试在 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');

使用 sed (GNU sed) 4.2.2、Ubuntu 16.04

这是澄清问题的屏幕截图:

注意: 好的,阅读@anishsane 的答案后问题就解决了。由于原始文件(来自 wordpress.org/latest.zip)具有 CRLF(windows)行结尾,因此添加 \n 会破坏文件视图。使用 "\r\n" 解决了这个问题:

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

我不确定为什么投反对票。请解释一下,以便我澄清问题。

【问题讨论】:

  • GNU sed,在 Ubuntu 上,添加 Windows 行尾?这似乎不太可能。
  • 所以每一行都有一个?所以他们在你运行 sed 之前就在那里?摆脱它们,然后运行 ​​sed,我敢打赌它们不会被添加。并不是说我可以回答为什么它会留在原地......
  • 我确定。查看截图prntscr.com/bh119k
  • 好的,一定是这样的:wp-config-sample 有 CRLF 行结尾

标签: php wordpress bash sed


【解决方案1】:

经过测试,无法复制。

该文件确实包含以 Wordpress 本身开头的 windows 行结尾。 (见the sample file)。

运行发布的命令(编号 2),结果为

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

这是预期的行为,虽然不是 OP 原始问题中的输出,但正是他们在屏幕截图中显示的内容。

【讨论】:

  • 我认为@micster 有道理。 wordpress.org/latest.zip 这里的文件有 windows CRLF 文件结尾。
  • 如果你尝试数字 1,它会像问题输出中一样。
【解决方案2】:

尝试将行尾从 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/

【讨论】:

  • ^M 实际上是一个字符,@micster。它是换行符(\r in C 语言和朋友)。
  • some_command filename > filename 几乎从来都不是您想要的。重定向运算符> 将在some_command 开始处理文件之前截断文件。如果您的命令支持,请使用some_command filename > filename.new && mv filename.new filename 或使用--in-place 之类的选项。 (sed 确实如此。)
【解决方案3】:

该文件最初具有 CRLF 行结尾。当您在 vim 编辑器中打开它时,vim 会理解该文件具有 CRLF 结尾并 隐藏 用户。通过编辑器添加的任何新行也将具有与文件其余部分相同的行结尾。

当您通过sed 添加新行时,它具有LF 行结尾。下次你在vim 中打开它时,vim 会看到混合行结尾,CRLF 和LF。 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,而在于原始文件。

【讨论】:

  • 很好的解释,它帮助我解决了这个问题,谢谢。请检查我添加的注释:)
猜你喜欢
  • 2017-01-17
  • 2020-10-10
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多