用sed连接某些行

时间:2019-01-21 23:35:11

标签: sed

我有一个看起来像这样的输入:

web.xml

我想用sed将其转换为:

1
2

3
4
5

6

我知道可以使用其他工具轻松完成此操作,但我想专门将sed作为学习练习来完成。 我已经尝试过了:

12
345
6

但它会打印:

sed ':x ; /^ *$/{ N; s/\n// ; bx; }'

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

引用GNU sed manual

  

处理诸如段落之类的文本块(而不是逐行)的一种常用技术是使用以下构造:

sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
     
      
  1. 第一个表达式/./{H;$!d}在所有非空行上运算,并将当前行(在模式空间中)添加到保持空间。除了最后一行,所有行上的模式空间都将被删除,并且循环将重新开始。

  2.   
  3. 其他表达式xs仅在空行(即段落分隔符)上执行。 x命令将保留行中的累积行取回模式空间。然后s///命令对段落中的所有文本(包括嵌入的换行符)进行操作。

  4.   

事实上,

sed '/./{H;$!d} ; x ; s/\n//g'

做你想要的。

答案 1 :(得分:2)

FWIW这是在UNIX中真正完成该任务的方法:

$ awk -v RS= -v OFS= '{$1=$1}1' file
12
345
6

以上内容可在任何UNIX机器上使用。

答案 2 :(得分:1)

一种GNU class Distance extends React.Component { constructor(props) { super(props); this.state = { distance: 0 }; } onChange = e => { // Extract value of select like so. Use parseInt for // improved type safety const valueSelectedByUser = parseInt(e.target.value); // Update distance in state via setState() this.setState({ distance : this.props.distance + valueSelectedByUser }); } render() { return ( <div> <p>{this.props.distance}</p> <select onChange={this.onChange}> <option value="30">30km</option> <option value="50">50km</option> <option value="70">70km</option> </select> </div> ); } } 方法:

awk

请注意,它将在最后一行之后添加尾随换行符$ awk -F"\n" '{gsub("\n","");}1' RS='\n{2,}' file 12 345 6