我有一个文件,其中包含嵌入宏的字符串,例如
int main() { $(3) return 0; $(0) }
字符序列“ $(n) ”应该被 n 个空格和行尾字符替换,以便生成的文本如下所示:
int main() {
return 0;
}
有没有办法使用某些 bash 实用程序(例如 sed 或 awk)来执行此操作?
答案1
这是一个完成这项工作的 perl 单行程序:
perl -ne 's/\s*\$\((\d+)\)\s*/"\n"." "x${1}/eg;print' file.txt
输出:
int main() {
return 0;
}
根据评论编辑:
perl -ne 's/\s*\$\((\d+)\)\h*(\R)?/"\n"." "x$1.$2/eg;print' file.txt
输入文件:
int main() { $(3) return 0; $(0) } $(0)
int main() { $(3) return 0; $(0) } $(0)
输出:
int main() {
return 0;
}
int main() {
return 0;
}
解释:
s/ : substitute
\s* : 0 or more spaces
\$\( : literally $(
(\d+) : group 1, 1 or more digits
\) : literally )
\h* : 0 or more horizontal spaces
(\R)? : group 2, optional, any kind of linebreak
/
"\n" : a linebreak
. : concatenate with
" "x$1 : a space that occurs $1 times, $1 is the content of group 1 (ie. the number inside parenthesis)
. : concatenate with
$2 : group 2, linebreak if it exists
/eg : flag execute & global