如何从文本文件中删除换行符?

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" &lt; yourfile.txt) &gt; 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 有一个参数,所以它不能被涂抹到-eperl -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 &gt; file.txt创建。

注意目标文件名不同,很重要,否则会抹掉原来的内容!

【讨论】:

那是useless cat. 这里的几个评论线程已经解释了如何将结果重定向到新文件。 感谢您指出这一点,我刚刚看到echo -n $(tr -d "\n" &lt; yourfile.txt) &gt; yourfile.txt 的评论,但之前没有看到。 这更令人费解,echo -n 周围存在众所周知的可移植性问题。这样做的简单明显的惯用方式是tr -d '\n' &lt;file.txt &gt;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 ' '

$(&lt;file.txt)”读取文件并将内容作为一系列单词“回显”,然后在它们之间用空格回显。 'tr' 命令然后删除所有空格:

22791;14336;22821;34653;21491;25522;33238;

【讨论】:

只要输入不是太大并且您使用的是 Bash(标记为 Bash,这样就可以了),它就可以工作。如果我现在写答案,那将是tr -d '\n' &lt; 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文本框\nReplace with一个空白空间然后填写复选框Regular expression 瞧。

【讨论】:

【参考方案20】:

同时删除文件末尾的尾随换行符

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"

【讨论】:

标签表明 OP 正在寻找基于 shell 的解决方案。 (FWIW,我个人理解 Python 对这些用例的吸引力)

以上是关于如何从文本文件中删除换行符?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java中的文件中删除换行符?

使用 php 读取文件时删除文本区域中的换行符

VB如何把文件内容显示在文本框中?

如何从控制台读取多行文本,然后将内容保存到带有换行符的文件中?

如何将文本输入写入文件中的换行符?

为啥我的 Linux 文本文件(使用 echo 创建)以换行符结尾?我怎样才能删除它? [复制]