我有一个看起来像这样的输入:
web.xml
我想用sed将其转换为:
1
2
3
4
5
6
我知道可以使用其他工具轻松完成此操作,但我想专门将sed作为学习练习来完成。 我已经尝试过了:
12
345
6
但它会打印:
sed ':x ; /^ *$/{ N; s/\n// ; bx; }'
有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
处理诸如段落之类的文本块(而不是逐行)的一种常用技术是使用以下构造:
sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
第一个表达式
/./{H;$!d}
在所有非空行上运算,并将当前行(在模式空间中)添加到保持空间。除了最后一行,所有行上的模式空间都将被删除,并且循环将重新开始。其他表达式
x
和s
仅在空行(即段落分隔符)上执行。x
命令将保留行中的累积行取回模式空间。然后s///
命令对段落中的所有文本(包括嵌入的换行符)进行操作。
事实上,
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
。