在查看 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"
也可以看看