求助:用什么命令可以去掉多余的换行符?

sh/bash/dash/ksh/zsh等Shell脚本
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

求助:用什么命令可以去掉多余的换行符?

#1

帖子 eternalubuntu » 2011-06-17 14:54

我有一堆从网页转换而来的txt文件,可能是转换的原因,txt文件中有不少的换行符。如下面这段文字:

代码: 全选

党中央在全国解放战争胜利的形势下,对解决西藏问题的基本方针是和平解放。这样
做不仅考虑在全国大形势下有这种可能,而且是为了团结藏族同胞,维护民族利益的根本
大计。但是西藏当时的上层统治集团在帝国主义扩张势力的支持下,顽固地抗拒中央和平
解决的办法,妄图分裂祖国。为此,我军在先遣任务中对进军昌都做了周密而细微的调查
                                    研究。
我想去掉这些多余的换行符,有没有什么办法??
试过sed和tr了,都还没想出什么好的解决方法。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助:用什么命令可以去掉多余的换行符?

#2

帖子 eexpress » 2011-06-17 14:56

你先hexdump看下,是\r还是\n
● 鸣学
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

Re: 求助:用什么命令可以去掉多余的换行符?

#3

帖子 eternalubuntu » 2011-06-17 15:00

添加一个文本附件作为示例。
附件
abc.txt
(33.16 KiB) 已下载 56 次
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

Re: 求助:用什么命令可以去掉多余的换行符?

#4

帖子 eternalubuntu » 2011-06-17 15:04

神,怎么用hexdump查看?
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

Re: 求助:用什么命令可以去掉多余的换行符?

#5

帖子 eternalubuntu » 2011-06-17 15:11

hexdump -x 的结果是 0a ,是不是意味着换行符是\n??
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求助:用什么命令可以去掉多余的换行符?

#6

帖子 lilydjwg » 2011-06-17 15:16

用 Vim,'fo' 选项里设置 B 或者 M,然后选中要处理的部分,按 J (大写的)。

BTW:建议重写转换程序,这样会更准确(如果原网页没问题的话)。
上次由 lilydjwg 在 2011-06-17 15:17,总共编辑 1 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助:用什么命令可以去掉多余的换行符?

#7

帖子 eexpress » 2011-06-17 15:16

是啊。确定不是\x0d\x0a。

替换,不要用sed。sed不跨行处理的。就是刚好不处理你这\n。

你这,分段的,不适合全部去掉。你不如用vim的选择模式,来处理。
● 鸣学
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

Re: 求助:用什么命令可以去掉多余的换行符?

#8

帖子 eternalubuntu » 2011-06-17 15:35

lilydjwg 写了:用 Vim,'fo' 选项里设置 B 或者 M,然后选中要处理的部分,按 J (大写的)。

BTW:建议重写转换程序,这样会更准确(如果原网页没问题的话)。
不是太明白,求详解。
能否先用tr 全部删除换行符,然后,再在空格处插入换行符?
头像
eternalubuntu
帖子: 210
注册时间: 2007-10-19 14:25

Re: 求助:用什么命令可以去掉多余的换行符?

#9

帖子 eternalubuntu » 2011-06-17 15:53

VIM替换方法是有效果,但是都替换成了空格,而且一个文本一个文本的处理似乎太慢,我有一大堆呢,还有没有更好的办法?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助:用什么命令可以去掉多余的换行符?

#10

帖子 eexpress » 2011-06-17 16:01

如果确定全文替换,一句Perl就够。
如果是分段替换,那没特征字符,没办法。
● 鸣学
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求助:用什么命令可以去掉多余的换行符?

#11

帖子 lilydjwg » 2011-06-17 18:32

eternalubuntu 写了:VIM替换方法是有效果,但是都替换成了空格,而且一个文本一个文本的处理似乎太慢,我有一大堆呢,还有没有更好的办法?
那是因为你的 'fo' 选项中没有标志 M 或者 B。

谁说 Vim 处理文本要一个一个地?我最开始html网页转txt就是用的 Vim,速度虽然不怎么样,但绝对是能完成任务的。

代码: 全选

vim **/*
:argdo %join
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 求助:用什么命令可以去掉多余的换行符?

#12

帖子 sk1418 » 2011-06-17 21:53

看了下你的文件,是\n

下面的命令可以帮你去掉\n。 其实还是LS说的,最好在你HTML-TXT转换的那里做点文章。

代码: 全选

sed 'N;x;s/\n//g' yourfile.txt
---
regards,

Kent
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

Re: 求助:用什么命令可以去掉多余的换行符?

#13

帖子 谢宝良 » 2011-06-17 22:51

我试了一下,我cp到latex的xeCJK后,多余空格全消失,而且还能自动排好版.如果你有一大堆,我可以帮你排好版面.但只能输出pdf文件.
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:用什么命令可以去掉多余的换行符?

#14

帖子 fnan » 2011-06-21 6:04

去除多余换行符,保留有效段落,不是非perl不可:
sed 's/$/)))/g' abc.txt|tr -d "\n"|sed 's/)))\s/\n /g;s/)))//g'
效果:
——————————————————————————————————————————————
1959年3月10日,西藏上层反动集团公开发动反革命武装叛乱。3月14日,中央军委电令我54军130师、134师开赴西藏参加平叛作战,由军长丁盛、政委谢家祥等领导同志组成军指挥所,简称“丁指”。
 3月17日,我134师在师长白斌、政委蓝亦农、卜占亚率领下,分别由兰州、武威、享堂等地乘车出发,沿青藏公路开进,于3月30日如期赶到拉萨、当雄等地。从此,我师便在西藏工委和西藏军区及军指领导下,投人了西藏平叛作战。*一、千里进军,直捣山南叛乱巢*
 穴山南东接林芝,西邻江孜,北依雅鲁藏布江天险,南与不丹、印度相邻,有20余条道路可通国外。全区12个县,人口17万,面积56000余平方公里。气候比较温和,物产丰富,素有“西藏粮仓”之称。西藏反动上层,视山南为理想的叛乱根据地。自1958年起,即在该区搜罗甘、青、川、滇等外省逃来之叛乱武装,并裹胁当地群众9000余人,组成所谓“卫教军”,多次攻打我山南分工委。1959年3月拉萨叛乱被粉碎后,叛乱集团的首脑分子率残部5000余人逃至山南,与当地叛乱武装分别盘据于雅鲁藏布江沿岸、羊卓雍湖畔及哲古、隆子宗等地,并宣布隆子宗为“临时首都”,妄图凭借其有利条件,继续与我顽抗。根据毛主席关于关门打狗的指示精神,西藏军区决定以134师及155团、159团、160团二营、11师之31团一营,分路进军山南,首先控制边境,尔后将山南境内之叛乱武装予以围歼。我师的任务是:401团分两路渡雅鲁藏布江,与155团三营一起首歼泽当之敌,尔后向南进击,协同159团、155团,将敌主力聚歼于拉加里以南、哲古以东、隆子宗以北地区;402团,于曲水渡江,歼灭贡嘎、打隆、多宗等地之敌,并与进至仁本宗之31团一营共同阻敌西逃;400团位拉萨、墨竹工卡、太昭一线机动,防山南之敌北窜,炮541团留驻拉萨担任警备负责拉萨附近各县的清剿工作。
 1959年4月7日,401团、402团,冲破敌之阻击,分别于温宗、曲水连夜渡过雅鲁藏布江。担负渡运任务的师工兵一连,冒着敌火阻击,整夜操渡,出色地完成了任务。全连荣立集体三等功。
 渡江后,401团即迅速合围泽当,决心与155团三营内外夹击围困我山南分工委达74天之久的500多叛乱分子。敌见势不妙,一部窜上了泽当东面的供坡热主峰,一部撤至乃东宗、昌朱寺一带,一部南逃。据此,401团即令先渡江之二营和师侦察连,直插昌朱寺南侧,截歼逃敌;三营围攻供坡热主峰;一营进占乃东宗西南要点,尔后向乃东宗攻击。8日8时,三营七、八连连续向供坡热主峰发起攻击,至13时,与155团六、九连同时攻占主峰,全歼守敌科1名,我亡5人伤7人。此次战斗,七连一排打得英勇顽强,首先攻至主峰附近,连续击退敌人3次反扑,歼敌55名。排长方章才指挥沉着带头冲击。班长杨海中腿负重伤仍坚持打机枪,直至壮烈牺牲。战后,一排荣立集体三等功。由于敌人乘隙仓皇南逃,望风披靡,401团即跟踪追击,初战阿拉岗,再战邓多江,合围隆子宗,直奔加玉宗,进驻三安曲林,经一星期连续转战,完成了进剿任务,封锁了加玉及其附近之边境。
 4月15日,由曲水渡江之402团,在扫清贡嘎、白地、浪卡子、打隆等地之敌后,由绒博分路向多宗开进。于16日至18日进行了多宗战斗,歼敌141名。我亡48人伤64人。此次战斗,该团部队不怕疲劳,翻越海拔6400米的马玉大山时,全团无一人掉队。八连报话员王广才腿被炸断,浑身被烧着,仍顽强地坚守在宗本府大门外监视敌人、报告情况,直至停止呼吸。战后,该团经短时间总结、整顿,又于4月20日,继续向边境挺进。与此同时,一营营长常英武率一个加强连,截歼了从品多南逃之敌。该连战斗积极性高,穷追猛打,勇敢沉着,经过一个半小时激战,全歼叛乱分子95名,缴枪41支,我无伤亡。在进剿期间,400团一、三营及炮营由仁敬里、阿沛桥公路一线,分六路向南插,歼灭冈底斯山以南、雅鲁藏布江以北地域之敌,先后合围了沃卡、加查、塔洛寺、巴塘等地,肃清了该区残敌,完成了防敌北窜的任务。
 截至4月26日止,我师与友军一起,全部封锁了山南通往国外的边境要道,捣毁了敌叛乱老巢。经2D余天进剿,共作战16次,歼敌1577名,缴炮1门,长短枪385支,机枪4挺,土枪7伪支,余敌作鸟兽散。
 当山南部队转人清剿后,我400团奉军区军指命令进人雪喀地区搜剿。5月6日,该团分两路开进战区,至5月9日,共歼敌59名。
——————————————————————————————————————————
不知道是否要这种效果?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:用什么命令可以去掉多余的换行符?

#15

帖子 fnan » 2011-06-21 7:36

章节之间还有标题,修改一下:
sed 's/$/)))/g' abc.txt|tr -d "\n"|sed 's/))))))/\n\n/g; s/)))\s/\n /g; s/)))//g'
效果:
——————————————————————————————————————————
1959年3月10日,西藏上层反动集团公开发动反革命武装叛乱。3月14日,中央军委电令我54军130师、134师开赴西藏参加平叛作战,由军长丁盛、政委谢家祥等领导同志组成军指
挥所,简称“丁指”。
 3月17日,我134师在师长白斌、政委蓝亦农、卜占亚率领下,分别由兰州、武威、享堂等地乘车出发,沿青藏公路开进,于3月30日如期赶到拉萨、当雄等地。从此,我师便在西
工委和西藏军区及军指领导下,投人了西藏平叛作战。

*一、千里进军,直捣山南叛乱巢*

  穴山南东接林芝,西邻江孜,北依雅鲁藏布江天险,南与不丹、印度相邻,有20余条道路可通国外。全区12个县,人口17万,面积56000余平方公里。气候比较温和,物产丰富,
有“西藏粮仓”之称。西藏反动上层,视山南为理想的叛乱根据地。自1958年起,即在该区搜罗甘、青、川、滇等外省逃来之叛乱武装,并裹胁当地群众9000余人,组成所谓“卫教军”,
多次攻打我山南分工委。1959年3月拉萨叛乱被粉碎后,叛乱集团的首脑分子率残部5000余人逃至山南,与当地叛乱武装分别盘据于雅鲁藏布江沿岸、羊卓雍湖畔及哲古、隆子宗等地
并宣布隆子宗为“临时首都”,妄图凭借其有利条件,继续与我顽抗。根据毛主席关于关门打狗的指示精神,西藏军区决定以134师及155团、159团、160团二营、11师之31团一营,分路
进军山南,首先控制边境,尔后将山南境内之叛乱武装予以围歼。我师的任务是:401团分两路渡雅鲁藏布江,与155团三营一起首歼泽当之敌,尔后向南进击,协同159团、155团,将
敌主力聚歼于拉加里以南、哲古以东、隆子宗以北地区;402团,于曲水渡江,歼灭贡嘎、打隆、多宗等地之敌,并与进至仁本宗之31团一营共同阻敌西逃;400团位拉萨、墨竹工卡、
太昭一线机动,防山南之敌北窜,炮541团留驻拉萨担任警备负责拉萨附近各县的清剿工作。
 1959年4月7日,401团、402团,冲破敌之阻击,分别于温宗、曲水连夜渡过雅鲁藏布江。担负渡运任务的师工兵一连,冒着敌火阻击,整夜操渡,出色地完成了任务。全连荣立集
体三等功。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复