我有一个从工具输出的文件(从DB查询)。 其中一个字段在某些行的末尾有^ M个字符。 这会导致我的输出被破坏。 当前行以^ M结尾时,如何将下一行附加到当前行。

我的机器安装了sed,awk,perl,ruby和python,我正在使用bash。

我使用sed尝试了以下方法:

sed -e :a -e '/^M$/N; s/^M\n//; ta' sourcefile > destfile

但那没用。

请指教。

谢谢,Karthick S.

===============>>#1 票数:5 已采纳

您看到的^ M字符实际上可能是回车。 您应该匹配正则表达式中使用\\ r的那些。 数据可能是由一个系统插入到数据库中的,该系统使用CRLF作为行结尾(Windows最有可能)而不仅仅是LF(像大多数* nix系统那样)。 我猜他们已经跟着换行了,所以你可能想要删除它们,而不是用换行符替换它们。

您可能在系统上有dos2unix命令,可以为您转换这些行结尾。

您可能希望首先使用dos2unix确保行结尾是一致的。 之后你可以删除这样的新行: cat infile | dos2unix | tr -d '\\n' > outfile cat infile | dos2unix | tr -d '\\n' > outfile cat infile | dos2unix | tr -d '\\n' > outfile 如果你想要一个以前使用换行符的空间你可以使用cat infile | dos2unix | tr '\\n' ' ' > outfile cat infile | dos2unix | tr '\\n' ' ' > outfile cat infile | dos2unix | tr '\\n' ' ' > outfile

作为旁注,使用sed删除换行是很困难的,因为sed编辑文件中的行一次处理一行。

===============>>#2 票数:1

^M表示ctrl + M,它是一个字符,而不是两个字符。 当你进行更换时,你输入的是两个字符还是一个?

一个字符: ctrl + v然后ctrl + m (正确)

两个字符: ^然后M (不正确,但看起来可能相同)

===============>>#3 票数:0

为了理解文件每行末尾出现的字符,我使用了@potong评论:

sed -n 'l0' file
>>> 1st line\r$
>>> last line\r$

我的文件以每行的\\r$结尾,所以我做了:

sed -i "s/\r//g" file

通过重写文件到位来摆脱\\r (或^M )。 这是sed的结果打印:

sed -n 'l0' file
>>> 1st line$
>>> last line$

===============>>#4 票数:0

我希望我能正确理解你的要求。 看下面的测试:

一个名为test的文件:

abc^M
___2ndline


xyz^M
###2ndline again

注意^M我用ctrl-v, ctrl-m键入vim

现在看到输出跟随awk行。 我希望这就是你所需要的:

kent$  awk  '/^M/{gsub(/^M/,"");printf $0;next;}1' test
abc___2ndline


xyz###2ndline again

  ask by Karthick S translate from so

未解决问题?本站智能推荐:

5回复

如果下一行少于一定长度,请删除文本文件中的换行符

我想创建一个包含bash,sed,awk或perl任意组合的脚本,如果下一行的长度小于特定长度,该脚本将删除该行的换行符。 假设我们要删除下一行少于5个字符的换行符。 如果我们有此源文本文件: 这是所需的输出: 这是一个脚本,用于标识所有少于5个字符的行: 它返回这个
3回复

在两个文件中找到公共行,然后用其他文件的下一行替换第一个文件的下一行

我想在两个文件中找到相同的行,然后用第二个文件的下一行替换第一个文件的下一行。 Sed,awk,Perl,Bash,欢迎任何解决方案。 比较是不区分大小写的,并且同一行可能多次出现。 文件1: 档案2: 以后,文件1应该是:
2回复

如何从下面的下一行复制值

我正在寻找Sed或Awk来解决这个问题,但是我完全迷失了。 没有起点。 我有一个包含这些文件的文件,因此我正在考虑使用delimiter(,)并使用索引/数组来复制值并替换另一个索引/数组。 由于array [6]在第一行中为空。 我想将array [6]从第二行复制到第一行。
3回复

将文本追加到文件中,而无需换行

在Linux机器上,我具有以下IP地址列表: 我想使用一些函数在每行的末尾添加单词“或”而不破坏每一行,例如: 我在sed或awk尝试过的每个实现都给了我错误的结果,因为它一直在尝试换行或在奇怪的地方添加输入。 实现这个目标的最简单方法是什么? 使用awk '$0=$0"
6回复

awk:如何在M行中的每N行中向数字添加一个常数?

我目前无法使用bash脚本编辑文件。 它是一个文件,其中包含数百个时间戳时一系列原子的笛卡尔坐标(x,y,z)。 对于由3个原子组成的系统,它如下所示: 现在,我想在4行中的每3行中向z坐标添加一个常数10。 有谁知道如何解决这个问题? 我已经尝试过awk。 但是,它只能输
3回复

如何使用sed删除文本文件中字符串的结尾?

我有以下文本文件,它是一长串字符串: 这些字符串需要删除结尾的/1或/2 。 我认为sed将是最好的选择(或者也许是另一个对正则表达式友好的工具,例如perl) 我认为sed 's/[0-9]+$//' file1.txt将删除每个字符串末尾的所有整数,但是如何删除/# ?
7回复

如何在文件的每一行末尾附加文件名?

我需要对数百个文件执行以下操作:将文件名(可能包含空格)追加到文件中每一行的末尾。 在我看来应该有某种方法可以做到这一点: 其中FILENAME代表当前文件的名称。 是否有一个sed变量代表当前文件名? 还是有人使用bash,awk等有其他解决方案?
2回复

sed / awk / perl:找到一个正则表达式,复制该行的5列并粘贴到下一行的开头

我有以下几行: 我需要做的是: 查找以数字[0-9]开头的行。 复制前5列,并用空格''分隔。 请将其粘贴在不以数字开头的下一行中。 感谢您的任何帮助。 欢呼声,色拉
1回复

排列一个文件的行与第二行中的行相同

我有两个文件,我想在第一个文件中以相同的行顺序排列第二个文件的行。 其中第2个文件的第2列和第5个文件与第1个文件的值相同,只是它们的顺序不同。 考虑到完整的行不仅要重新排列第2列和第3列。 请建议。 所需输出:
3回复

从数据声明变量,并在一行代码中对数据运行多个命令

今天,我遇到了一个错误,希望别人能提供我所没有的解决方案的意见。 错误在数据集中。 第一行和第二行/记录的最后一列/字段中的数据应相同,并且行/记录1的倒数第二列/字段始终为“ 1”。 问题是当情况并非如此时,需要采取纠正措施。 这样的错误数据就存在于名为“ sample.txt”的