假设模式为字符串"Love"
输入
This is some text
Love this or that
He is running like a rabbit
输出
This is some text
Love this or thatHe is running like a rabbit
我注意到使用sed删除换行符非常不方便,有什么建议吗?
你可以使用这个:
sed '/^Love/{N;s/\n//;}' love.txt
细节:
/^Love/
用于识别要处理的行,如果你愿意,你也可以使用/[Ll]ove/
N
添加下一行到模式空间。执行此命令后,模式空间会包含Love this or that\nHe is running like a rabbit
s/\n//
替换换行符
sed ':a;/[Ll]ove[^\n]*$/{N;ba};s/\n//g' love.txt
通过一个简单的循环来附加每个连续匹配行以解决问题(这次是全局替换)。 - Casimir et HippolytePerl:
$ perl -pe 's/^(Love[^\n]*)\n/\1/' file.txt
This is some text
Love this or thatHe is running like a rabbit
或者,如果意图仅仅集中在 \n
上,你可以基于模式使用 chomp
:
$ perl -pe 'chomp if /^Love/' file.txt
This is some text
Love this or thatHe is running like a rabbit
通过Perl语言,
$ perl -pe 's/^Love.*\K\n//' file
This is some text
Love this or thatHe is running like a rabbit
\K
可以用来丢弃之前匹配到的字符。
OR
$ perl -pe '/^Love/ && s/\n//' file
This is some text
Love this or thatHe is running like a rabbit
如果一行以字符串 Love
开始,则会从该行中删除换行符。
chomp
。"perl -pe 'chomp if /^Love/' file"的意思是对文件进行处理,如果该行以"Love"开头,则去掉该行的换行符。 - jaypal singh$ awk '/Love/{printf "%s ",$0;next} 1' file
This is some text
Love this or that He is running like a rabbit
释义:
/Love/{printf "%s ",$0;next}
对于包含 Love
的行,使用 printf
命令打印该行内容,不换行。然后 awk
继续处理下一行。
1
对于不包含 Love
的行,按正常方式打印(换行)。1
命令是 awk
打印的简写命令。
awk
变体:
awk '{ORS=(/Love/?FS:RS)}1' file
This is some text
Love this or that He is running like a rabbi
这会根据模式改变ORS
awk
。awk '{printf "%s%s",$0,(/Love/?FS:RS)}' file
This is some text
Love this or that He is running like a rabbit
Love
,则使用分隔符 FS
,否则使用 RS
。awk '{printf "%s"(/Love/?FS:RS),$0}' file
awk '{ORS=(/Love/?"":RS)}1'
。甚至可以使用这个:awk 'ORS=(/Love/?FS:RS)'
。 - Jotne
sed
每次只能处理一行。每次开始处理一行时,它会删除换行符并将其放置在模式空间中。模式空间是所有操作发生的地方。一旦替换完成,它会放置换行符并打印到STDOUT
。要删除换行符,您需要使用N
,它将下一行附加到以\n
分隔的模式空间中,然后可以通过替换来删除它。 - jaypal singhthat
和He
之间留空格吗? - Jotne