【问题标题】:using sed to change <CR><LF> to a symbol使用 sed 将 <CR><LF> 更改为符号
【发布时间】:2013-02-01 06:15:26
【问题描述】:

我正在使用 GnuWin32(sed 4.2.1 和核心实用程序 5.3.0)在 Windows Vista 上工作。还有 ActivePerl 5.14.2 包。

我有一个大的多记录文件。文件中每条记录的结尾用四个美元符号 ($$$$) 表示。在每个逻辑记录中都有许多“CRLF”。

我想用 |+| 之类的符号替换所有 CRLF 实例。然后我将$$$$替换为CRLF。结果:每行一条记录导入 Excel 以供进一步操作。

我尝试了几种将CRLF 转换为|+| 的方法,但都没有成功。

例如,一种方法是:sed -e "s/[\r\n]/|+|/g" source_file_in target_file_out

另一种方法使用tr -d删除\r,然后是第二条语句:sed -e "s/\n/|+|/g" source_file_in target_file_out

tr 语句有效; sed 声明没有。

我已阅读以下文章,但不知道如何调整它们以将 \r\n 替换为 |+| 之类的符号。

sed: how to replace CR and/or LF with "\r" "\n", so any file will be in one line

Replace string that contains CRLF?

How can I replace a newline (\n) using sed?

如果使用sed(和tr)无法轻松解决此问题,那么如果有人告诉我如何使用,我将使用 Perl。


感谢 Ed 的推荐。

awk 脚本尚未完全运行,因此我将添加一些缺失的细节,希望您可以微调您的建议。

首先,我正在运行 gawk v3.1.6.2962。我相信 awk 实现可能存在差异,所以这可能是一个有用的信息。

接下来,关于数据类型和数据来源的更多信息。

数据是关于化学品的(输入立体化学绘图程序的文本数据)。

化学文件为 .sdf 格式。

当我在 NotePad++ 中打开“133711.sdf”(使用查看/显示符号/显示所有字符)时,我看到屏幕截图中显示的数据: https://dl.dropbox.com/u/3094317/_master_1_screen_shot_.png

如您所见,只有 LF - 没有 CR。 我相信这意味着 .sdf 文件的来源是 UNIX 系统。

接下来,我运行 Windows 命令 COPY *.sdf _master_2_.txt。这会创建我想要解析成记录的非常大的文件。

_master_2_.txt 与 133711.sdf 具有相同的结构 - 仅 LF;没有 CR。

然后,我在 .BAT 文件中运行您的 awk 建议。我需要用双引号替换你的单引号,因为微软让我这样做了。

awk -v FS="\r\n" -v OFS="|+|" -v RS="\$\$\$\$" -v ORS="\r\n" "{$1=$1}1" C:_master_2_.txt >C:\output.txt

我附上了 output.txt 的屏幕截图: https://dl.dropbox.com/u/3094317/output.txt.png

如您所见,awk 命令没有成功将“\r\n”替换为“|+|”。

此外,Windows 使用 CRLF 创建了 output.txt。

它确实成功地将四个 $ 替换为 CRLF。

这些信息是否足以更新您的 awk 建议以处理与 Windows 相关的问题?

【问题讨论】:

  • 我建议先使用 sed/awk 来格式化您的问题文本...
  • 你的问题被忽视了,因为它的格式很糟糕。请阅读FAQ
  • sed 是用于在单行上进行简单替换的出色工具。对于其他任何事情,请使用 awk。

标签: windows sed gnuwin32


【解决方案1】:

用 GNU awk 试试这个:

awk -v FS='\r\n' -v OFS='|+|' -v RS='\\$\\$\\$\\$' -v ORS='\r\n' '{$1=$1}1' file

我从您更新的问题中看到您使用的是 Windows。为避免荒谬的引用规则和问题,请将其放入名为“whatever.awk”的文件中:

BEGIN{FS="\r\n"; OFS="|+|"; RS="\\$\\$\\$\\$"; ORS="\r\n"} {$1=$1}1

然后运行它

awk -f whatever.awk file

看看这是否符合你的要求。

【讨论】:

  • 感谢 Ed 的推荐。 awk 脚本尚未完全运行,因此我将添加一些缺失的细节,希望您可以微调您的建议。我已经在这里解释了输入和输出 - I/O 比我原来问题的 cmets 部分所允许的要长。 dl.dropbox.com/u/3094317/_follow_up_post_.mht
  • 不要将您的示例输入和预期输出放在其他网站上,也不要放在原始帖子的 cmets 部分。只需编辑您的原始帖子以提供缺失的信息。
  • @user2028514 - 我更新了我的答案,向您展示如何避免 Windows 引用问题。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2013-06-26
  • 2019-03-14
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多