我有一个文件包含
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/$/)/;}'