如何从文本文件中删除换行符?
Posted
技术标签:
【中文标题】如何从文本文件中删除换行符?【英文标题】:How do I remove newlines from a text file? 【发布时间】:2011-03-09 06:24:02 【问题描述】:我有以下数据,我需要将它们全部放在一行中。
我有这个:
22791
;
14336
;
22821
;
34653
;
21491
;
25522
;
33238
;
我需要这个:
22791;14336;22821;34653;21491;25522;33238;
编辑
这些命令都不能完美运行。
他们中的大多数让数据看起来像这样:
22791
;14336
;22821
;34653
;21491
;25522
【问题讨论】:
复制粘贴到浏览器的地址栏或其他文本字段中。 Quick'n'dirty 但适用于少量数据。 【参考方案1】:tr --delete '\n' < yourfile.txt
tr -d '\n' < yourfile.txt
编辑:
如果此处发布的命令都不起作用,那么除了换行符分隔字段之外,您还有其他内容。可能您的文件中有 DOS/Windows 行结尾(尽管我希望 Perl 解决方案即使在这种情况下也能工作)?
试试:
tr -d "\n\r" < yourfile.txt
如果这不起作用,那么您将不得不更仔细地检查您的文件(例如在十六进制编辑器中)以找出您想要删除的实际字符。
【讨论】:
如何将此输出写入同一个文件或另一个文件? 我认为tr
不适合空行。你怎么看? - - 我认为sed
是这里描述的最佳选择***.com/q/16414410/54964
要将输出路由到另一个文件,只需使用输出重定向。要将其路由到相同的文件管道,请使用“sponge”(在 Debian 基础系统的“moreutils”包中可用)。
要将输出写入同一个文件,请使用子shell echo -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
@andpei 非常感谢,这是一个简单的 shell 脚本,它采用文件名 ($1) 并执行相同的工作: echo -n $(tr -d "\n" $1 将其放入 removeNL.sh 文件 & chmod 777 并运行 $ ./removeNL yourfile.txt【参考方案2】:
perl -p -i -e 's/\R//g;' filename
必须完成这项工作。
【讨论】:
高尔夫到perl -pie 's/\R//g' filename
不,-i
有一个参数,所以它不能被涂抹到-e
:perl -i -pe ...
【参考方案3】:
tr -d '\n' < file.txt
或者
awk ' printf "%s", $0 ' file.txt
或者
sed ':a;N;$!ba;s/\n//g' file.txt
此页面here 有许多其他方法可以删除换行符。
已编辑以消除对猫科动物的虐待 :)
【讨论】:
【参考方案4】:paste -sd "" file.txt
【讨论】:
在 Solaris (10) 上paste -sd ""
默认情况下在 STDIN 上不起作用,所以如果您要使用它,请使用:(some command) | paste -sd "" -
如果您还想删除 final 换行符,这将不起作用。它只删除中间换行符。
这在 Mac OS 上不起作用,Sundeep 的版本可以。 paste -sd'\0' -
【参考方案5】:
你可以在 vim 中编辑文件:
$ vim inputfile
:%s/\n//g
【讨论】:
并用空格替换::%s/\n/ /g
【参考方案6】:
使用
head -n 1 filename | od -c
找出什么是冒犯的角色。 然后使用
tr -d '\n' <filename
对于低频
tr -d '\r\n' <filename
对于 CRLF
【讨论】:
【参考方案7】:扩展previous answer,这会删除所有新行并将结果保存到新文件(感谢@tripleee):
tr -d '\n' < yourfile.txt > yourfile2.txt
哪一个比“没用的猫”好(见 cmets):
cat file.txt | tr -d '\n' > file2.txt
对于删除文件末尾的新行也很有用,例如使用echo blah > file.txt
创建。
注意目标文件名不同,很重要,否则会抹掉原来的内容!
【讨论】:
那是uselesscat.
这里的几个评论线程已经解释了如何将结果重定向到新文件。
感谢您指出这一点,我刚刚看到echo -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
的评论,但之前没有看到。
这更令人费解,echo -n
周围存在众所周知的可移植性问题。这样做的简单明显的惯用方式是tr -d '\n' <file.txt >file2.txt
我们需要注意读写不能使用相同的文件名,否则文件会为空。【参考方案8】:
将 sed 与 POSIX classes 一起使用
这将删除所有仅包含空格(空格和制表符)的行
sed '/^[[:space:]]*$/d'
只要把你正在使用的东西用管道传送到那个地方
示例
cat filename | sed '/^[[:space:]]*$/d'
【讨论】:
sed -i '/^[[:space:]]*$/d' 文件名 ...用于就地编辑;上面的答案会输出到屏幕上【参考方案9】:使用 man 1 ed:
# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
ed -s file <<< $'1,$j\n,p' # print to stdout
ed -s file <<< $'1,$j\nwq' # in-place edit
【讨论】:
【参考方案10】:今天遇到同样的情况,在vim或nvim中超级简单,你可以使用gJ
加入行。对于您的用例,只需执行
99gJ
这将加入你所有的 99 行。您可以根据加入的行数调整99
的数量。如果只是加入 1 行,那么只有gJ
就足够了。
【讨论】:
【参考方案11】:$ perl -0777 -pe 's/\n+//g' 输入>输出
$ perl -0777 -pe 'tr/\n//d' 输入>输出
【讨论】:
【参考方案12】:如果数据在file.txt中,那么:
echo $(<file.txt) | tr -d ' '
“$(<file.txt)
”读取文件并将内容作为一系列单词“回显”,然后在它们之间用空格回显。 'tr' 命令然后删除所有空格:
22791;14336;22821;34653;21491;25522;33238;
【讨论】:
只要输入不是太大并且您使用的是 Bash(标记为 Bash,这样就可以了),它就可以工作。如果我现在写答案,那将是tr -d '\n' < file.txt
,这是公认的答案所做的(我很惊讶我当时没有写它)。这可能只是为了展示“另一种方法”。【参考方案13】:
xargs
也使用换行符(但添加了最后一个尾随换行符):
xargs < file.txt | tr -d ' '
【讨论】:
【参考方案14】:假设您只想保留数字和分号,假设没有重大编码问题,以下应该可以解决问题,尽管它也会删除最后一个“换行符”:
$ tr -cd ";0-9"
您可以轻松修改以上内容以包含其他字符,例如如果要保留小数点、逗号等。
【讨论】:
【参考方案15】:书呆子事实:改用 ASCII。
tr -d '\012' < filename.extension
(编辑因为我没有看到具有相同解决方案的该死的答案,唯一的区别是我的有 ASCII)
【讨论】:
【参考方案16】:使用 gedit 文本编辑器 (3.18.3)
-
点击搜索
点击查找和替换...
在查找字段中输入
\n\s
将替换为留空(无)
选中正则表达式框
点击查找按钮
注意:这并不能完全解决 OP 最初存在 7 年的问题,但应该可以帮助一些从 SE 到这里的新手 Linux 用户(比如我),他们有类似的“我如何将我的文本全部放在一个上”行”问题。
【讨论】:
【参考方案17】:我会用 awk 来做,例如
awk '/[0-9]+/ a = a $0 ";" END print a ' file.txt
(缺点是 a 在内存中“累积”)。
编辑
忘记了 printf!也一样
awk '/[0-9]+/ printf "%s;", $0 ' file.txt
或者可能更好,它已经在使用 awk 的其他 ans 中给出。
【讨论】:
【参考方案18】:当我从文件中复制代码 sn-p 并且我想将其粘贴到控制台而不添加不必要的新行时,我通常会得到这个用例,我最终做了一个 bash 别名
(如果你好奇,我称它为oneline
)
xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
xsel -b -o
读取我的剪贴板
tr -d '\n'
删除新行
tr -s ' '
删除重复出现的空格
xsel -b -i
将此推送回我的剪贴板
之后,我会将剪贴板的新内容粘贴到控制台或其他任何地方的单行中。
【讨论】:
【参考方案19】:您错过了最明显和最快速的答案,尤其是当您需要在 GUI 中执行此操作以修复一些奇怪的自动换行时。
打开gedit
然后Ctrl + H,然后输入Find
文本框\n
和Replace with
一个空白空间然后填写复选框
Regular expression
瞧。
【讨论】:
【参考方案20】:同时删除文件末尾的尾随换行符
python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
【讨论】:
标签表明 OP 正在寻找基于 shell 的解决方案。 (FWIW,我个人理解 Python 对这些用例的吸引力)以上是关于如何从文本文件中删除换行符?的主要内容,如果未能解决你的问题,请参考以下文章