使用 sed 删除匹配模式不适用于 mac os Catalina

Posted

技术标签:

【中文标题】使用 sed 删除匹配模式不适用于 mac os Catalina【英文标题】:Deleting matching pattern with sed doesn't work with mac os Catalina 【发布时间】:2020-02-20 05:21:28 【问题描述】:

我正在拼命寻找一个看似非常简单的问题的答案:我想从一个 txt 文件中删除所有匹配的模式。 我在 Mac OS Catalina 下使用以下命令:

sed 's/^M//' $filename > text_clean.txt

$filename 包含我正在执行操作的 txt 文件的名称。 "^M" 模式代表 Mac OS 下的换行符:我已经测试了几乎所有我能找到的东西,这是唯一可行的解​​决方案。

所以,发生的事情是以下命令完成了这项工作:

sed 's/^M/AAAAA/' $filename > text_clean.txt 

但只是部分因为它替换为“AAAAA”字符,这不是我想要的。

执行 sed 's/^M//' $filename > text_clean.txt 时,结果文件完全没有变化,所以我猜测要么命令没有执行(但为什么?),或者我必须插入一个特定的“空”字符,因为我使用的是 Mac OS shell(但是哪个?)。

我也用 gsed 进行了测试(在安装自制软件之后)......但结果与上述完全相同。

我想我遗漏了一些明显的东西,但我真的不明白是什么!

【问题讨论】:

sed 's/\r//g' $filename > text_clean.txt @WiktorStribiżew sed 中的 C 转义是一个 GNU 扩展,可以与上述 gsed 一起使用(假设它代表 GNU sed)。 sed 's/'$'\r''//g' "$filename" > text_clean.txt怎么样 :) 也许sed 没有公证 在Catalina 上运行,Gatekeeper 阻止它运行:) 参见例如Not LibreOffice too? Beloved open-source suite latest to fall victim to the curse of Catalina 像这样使用tr tr -d '\r' <inputfile >outputfile 【参考方案1】:

让我们尝试使用 grep 的另一种方式。

我已经创建了如下的 test.txt 文件

bash-3.2$ cat test.txt
AA
BB
CC
MA
MB
BM
CM
MU
MZ
SH
JH
HJ
12M
M45
M*&
M#$
12

用 grep

bash-3.2$ grep -v ^M test.txt > tmp.txt; mv tmp.txt test.txt

使用“^M”执行 grep,即所有以“M”开头的行并使用反向选项“-v”选择其余行。将 grep 的输出移动到 tmp.txt 文件中,然后将该文件替换为原始文件。

bash-3.2$ cat test.txt
AA
BB
CC
BM
CM
SH
JH
HJ
12M
12

祝你好运。

【讨论】:

以上是关于使用 sed 删除匹配模式不适用于 mac os Catalina的主要内容,如果未能解决你的问题,请参考以下文章

gfortran 不适用于 Mac OS X 10.9(小牛)

while 循环中的 sed 命令不适用于 ubuntu

使用 sed/perl/awk 替换第一次出现的匹配文本

iCarousel 类不适用于 xcode 4.2 和 mac os 10.6 上的 ARC

艾克斯 | sed -i 选项不适用于特定的行号

Linux三剑客(sed)-编辑匹配到的文本