![如何将文本文件中的所有行合并为一行?](https://linux22.com/image/961997/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
我想将文本中的所有行合并为一行。我是编程新手,想边做边学。我花了四个小时尝试解决这个问题。我知道这个问题有一个简单的解决方案。以下是我一直在尝试的方法。
sed -e 'N;s/\n//' myfile.txt #不执行任何操作 sed -e :a -e N -e 's/\n/ /' -e ta myfile.txt #输出全部搞乱了,我看不懂语法 cat myfile.txt | tr -d '\n' > myfile.txt # 删除所有行
这是文本文件:
500212 262578-4-4 23200 格里菲斯实验室有限公司 格里菲斯实验室 南都柏林郡议会 办公室 办公室(工业) 列出应纳税额 2 Pineview 工业区 费豪斯路 诺克利昂 2007 年 12 月 31 日 2008 年 1 月 1 日”
我不知道我哪里做错了……
答案1
tr
就像你使用它一样应该工作起来也最简单——你只需要输出到另一个文件。如果你使用输入文件作为输出,结果就是一个空文件,正如你所观察到的;
猫myfile.txt | tr -d'\n'>单行文本
你需要记住,有些编辑器以 来结束一行\r\n
。在这种情况下,使用
cat myfile | tr -d '\r\n'
答案2
简单方法
另一种方法是使用 awk,
cat myfile.txt | awk '{print}' ORS=''
输出:
500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIES南都柏林郡议会办公室办公室(工业)List Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon2007 年 12 月 31 日2008 年 1 月 1 日”
笔记:
ORS=''-> ORS(输出记录分隔符)。(即)您的字段分隔符,您可以在单引号之间使用任何字符作为字段分隔符。使用此 awk 方法,我们可以包含空格和所有字符。
希望这会有帮助!
答案3
編輯:
搜索并\n
用空格“ ”替换。
您可以通过转到“搜索”->“替换”
或通过键盘快捷键Ctrl+来获取替换窗口H
请参阅下面的截图:
您的原文位于第 1-14 行。
结果位于第 16 行。
答案4
没有必要将标签:a
放在主指令之外,也没有-e
必要使用选项;最后,/$/
是多余的(每一行都有一个 EOL 字符)。
改进其他答案,可以得到
sed -i ':a; N; s/\n/ /; ta' file
如果写成下面这样就更清楚了,
sed -i ':a
N
s/\n/ /
ta' file
该命令的工作原理如下:
N
将下一行附加到已包含当前行的(多行)模式空间;s/\n/ /
用空格替换\n
生成的换行符;N
ta
转到标签后面的脚本行:a
只要步骤 2 中的替换成功,IE如果发生了替换,则执行跳转到步骤 1,而不会“到达”脚本的末尾,IE 没有读取另一行输入。
请注意以下几点;
sed
按顺序逐行读取输入文件的行,从第一行开始;:a
只是一个标签,而不是要执行的命令;N
原则上可以在任何线路上执行,但是s/\n/ /
(原则上在任何一行执行)成功除最后一行外的任何一行, 所以ta
使脚本的结尾可到达仅当读取最后一行输入时(唯一s
失败的一行),所以- 之后不再有输入行读入模式空间第一个被读入其中,除非最后一个被读入,但是没有进一步的行可读入,因此
p
执行隐式命令。
因此剧本基本上是这样的第一行输入并继续逐行添加以下行,每次都用空格替换换行符;之后最后一行被附加(并\n
在空格中更改),N
不能附加任何行,s
失败,ta
被跳过,到达脚本末尾,并且p
在当前looong 1行模式空间上执行隐含的 rint 语句。
该选项用整个 1 行模式空间-i
替换输入文件。file