文本处理:在bash中转换等效数量的空格中的数字


2

我有一个包含嵌入式宏的字符串的文件

int main() { $(3) return 0; $(0) }

字符序列“$(n)”应替换为n个空格和行尾字符,以便生成的文本如下所示:

int main() {
   return 0;
}

有没有办法使用一些bash实用程序,例如sed或awk?

Answers:


2

这是一个执行工作的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

你知道这是否可用于sed?我的机器上没有perl。谢谢。
Fabio

@Fabio:我不是很擅长sed。我不知道是否有可能使用x运营商
Toto

我安装了perl并尝试了这个。它工作得很好。唯一的问题是它死了没有转换为换行终止宏。例如,如果在一个文件中我有两个相同的行,如下所示:int main() { $(3) return 0; $(0) } $(0),我希望尾随$(0)在两行之间引入一个空行,但事实并非如此。这是为什么?
法比奥

@Fabio:看我的编辑。
托托
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.