![使用 sed 的正则表达式: `'1{/^$/d}'` 有什么作用?](https://linux22.com/image/207111/%E4%BD%BF%E7%94%A8%20sed%20%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9A%20%60'1%7B%2F%5E%24%2Fd%7D'%60%20%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
在查看 shell 脚本时,我遇到了这一行
sed '1{/^$/d}' $file1 >> $file2
这里有什么意义呢sed '1{/^$/d}'
?
答案1
如果第 1 行为空,则将其删除......
1{
- 如果我们在 1 号线/^$/
- 这是一个空行d
- 删除该行}
- 条件结束
下面的例子。
$ cat x1
Hello
World
$ sed '1{/^$/d}' x1 >x2
$ cat x2
Hello
World
$
答案2
GNUsed
表达式
1{/^$/d}
哪个写起来更便携
1{/^$/d;}
或者
1 {
/^$/ d
}
分为两部分:
1 {...}
/^$/ d
如果当前行是输入的第一行,第一部分将触发大括号内的命令。
d
如果当前行为空,即如果行的开头 ,^
后面紧跟着行的结尾 ,,$
第二部分将触发该命令。该d
命令丢弃当前输入并立即开始下一个循环(这意味着它跳到下一行输入并从头开始计算表达式)。
两者1
和/^$/
都是地址影响后续命令将应用于哪些行。
简而言之,sed
如果输入的第一行为空,您的命令将删除它,同时避免删除任何其他空行。
表达方式
/^$/ { 1 d; }
会做同样的事情,但需要sed
对每一行输入执行正则表达式匹配,因此可能会更昂贵(尽管除非您的输入很大并且计算机非常慢,否则您是否会注意到任何差异是值得怀疑的)。
除此之外,您很可能应该引用命令中的变量,并且由于我们不知道 中的内容$file1
,因此我们最好防止命令意外地将值解释为一组选项(如果它以破折号开头):
sed -- '1 { /^$/ d; }' "$file1" >>"$file2"
或者,
sed -e '1 { /^$/ d; }' -- "$file1" >>"$file2"
或者,sed
从标准输入读取,
sed '1 { /^$/ d; }' <"$file1" >>"$file2"
也可以看看