使用sed将<cr> <lf>更改为符号</lf> </cr>

时间:2013-01-31 10:45:59

标签: windows sed gnuwin32

使用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&gt; C:\ output.txt

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

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

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

它确实用CRLF成功取代了四个$。

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

1 个答案:

答案 0 :(得分:0)

尝试使用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

并查看是否符合您的要求。