使用 SED 更改为<CR><LF>符号



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

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

我想用诸如

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

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

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

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

tr声明奏效了;sed声明没有奏效。

我已经阅读了以下文章,但不知道如何调整它们以用|+|这样的符号替换rn

sed:如何将 CR 和/或 LF 替换为 "\r" "",以便任何文件都在一行中

替换包含 CRLF 的字符串?

如何使用 sed 替换换行符 ()?

如果这个问题不能用sed(和tr)轻松解决,那么如果有人告诉我如何做,我会使用 Perl。


谢谢艾德的推荐。

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 - 仅低频; 无 CR。

然后,我在.BAT文件中运行您的 awk 建议。我需要用双引号替换你的单引号,因为Microsoft造就了我。

awk -v FS="\r" -v OFS="|+|" -v RS="\$\$\$\

$" -v ORS="\r" "{$1=$1}1" C:_master_2_.txt>C:\output.txt

我附上了输出的屏幕喊叫.txt: https://dl.dropbox.com/u/3094317/output.txt.png

如您所见,awk 命令未成功将 "\r" 替换为 "|+|"。

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

它确实成功地用CRLF取代了四个美元。

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

试试这个 GNU awk:

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

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

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

并运行它

awk -f whatever.awk file

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

最新更新