使用 sed 的正则表达式: `'1{/^$/d}'` 有什么作用?

使用 sed 的正则表达式: `'1{/^$/d}'` 有什么作用?

在查看 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. 1 {...}
  2. /^$/ 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"

也可以看看

相关内容