连接模式行和连续的非空行,用逗号分隔并括在 () 中

连接模式行和连续的非空行,用逗号分隔并括在 () 中

我有一个文件包含

click
css_add_violation_false

click
css_add_claim_false

select
css_driver1_birth_date_month
birth_date_month

select
css_driver1_birth_date_day
birth_date_day

如何用 click(value) 替换 click[newline]value?
或单击[换行符]值[换行符]值并单击(值,值)

我无法弄清楚,sed可能是因为它不适合多行内容。

我尝试使用tr删除回车符

tr 'select\n' 'select('

但这删除了所有回车符并添加了很多(

(注:OSX)

期望的输出:

click(css_add_violation_false)
click(css_add_claim_false)

select(css_driver1_birth_date_month, birth_date_month)
select(css_driver1_birth_date_day, birth_date_day

如果它可以处理任意数量的参数直到看到空行,那么这将是一个更好的更通用的答案。

答案1

awk

awk '{if($0=="click"){getline n;printf "%s(%s)\n", $0, n}else{print}}' file

如果该行匹配click,则将下一行加载到名为 的变量中n,然后打印所需的输出格式。

编辑:

如果多行的数量可变,并且您想要将它们组合起来直到出现空行,请使用以下命令:

awk '{if($0=="click"){getline n; printf "%s(%s", $0, n;
  while($0!=""){printf ",%s", $0; getline};
  printf ")\n\n", x}else{print}}' file

它打印以逗号分隔的行,直到找到空行。

答案2

perl是完成这项工作的好工具:

$ perl -p00e 's/click\n(.*)\n/click(\1)\n/' file
click(css_add_violation_false)

click(css_add_claim_false)

答案3

为了GNU sed

sed -Ez 's/(click)\n([^\n]*)/\1(\2)/g'

或旧式

sed '/click/{N;s/\n/(/;s/$/)/;}'

相关内容