使用 sed 格式化函数调用语法
Format function calls syntax with sed
我想在某些 fortran 程序中格式化函数调用的语法,但找不到满足我需要的方法。
源码中可能遇到的语法可以是:
func_example( x,y,z )
other_func_example(x,y,z, t)
another_one( x,y )
...
我需要的语法正是:
func_example(x, y, z)
other_func_example(x, y, z, t)
another_one(x, y)
...
我找到了一个完全删除花括号之间 spaces 的 sed 解决方案:
echo -e "function{x,y,z}\n function{ x,y,z}\n function{x,y,z }\n function{ x,y,z }"
| sed -e '/{/,/}/{s#\s*##g}'
这提供了:
function{x,y,z}
function{x,y,z}
function{x,y,z}
function{x,y,z}
这接近我的需要,但仍有问题:
- 不适用于标准括号。我应该以一种我无法到达的方式逃离他们。
- 在逗号
后不留下space
对于这方面的任何帮助,我将不胜感激。 Sed 在我看来是最好的选择。我也接受任何完整的 bash 或 awk 解决方案,但我想避免使用 perl,因为我对它几乎一无所知。
以下:
echo 'function( x,y,z )
function(x,y,z)
function(x, y,z)' |
sed 's/\(function\)([[:space:]]*\([a-z]*\)[[:space:]]*,[[:space:]]*\([a-z]*\)[[:space:]]*,[[:space:]]*\([a-z]*\)[[:space:]]*)/(, , )/'
输出:
function(x, y, z)
function(x, y, z)
function(x, y, z)
它:
- 匹配
function([a-z]*,[a-z]*,[a-z]*)
与所有标记之间任意数量的 [[:space:]]*
个白色字符(空格、制表符)。
- 记住函数名和参数名,使用sed的
\(...\)
- 然后输出带有空格和逗号的标记
(, , )
- 请注意,它也适用于奇怪的输入,例如
function(,,)
- 如果您要格式化某些 C 代码,请使用
astyle
或 indent
或为此创建的其他实用程序。
当你想先去掉逗号周围的空格时,你可以使用
... | sed -r 's/([(,]) *//g; s/ ([),])//g; s/,/, /g'
备选方案:您可以使用 tr
或简单的
开始删除所有空格
... | sed 's/ //g; s/,/, /g'
我找到了一个可能不是最聪明的 awk 解决方案,但它适用于任意数量的昏迷。这个想法是生成一个脚本,其中包含一些要启动的 sed 命令。
我分享它以防它对某些人有任何帮助 reader.
输入测试文件:
some_func(x, y,z)
some_func_a(x, y, z, t )
some_func_b(x,y,z)
some_func_z(x, y , z)
some_func(x, y , z )
! some comment
some_func( x, y)
some_func_1(x)
some text
some_func(x, z, a, b,e)
some_func_da(x, y,d, z)
some_func_bla( x, y, z)
some_text without parenthesis
我得到的脚本是这样的:
while read line
do
# Gets what's in parenthesis and the function name
in_par=$(echo $line|awk -F "[()]" '/\(/{print "(" ")" }')
func_name=$(echo $line|awk -F "[()]" '/\(/{print }')
# Formats to my desired format
in_par_mod=$(echo $line|awk -F "[()]" '/\(/{print }'|awk '{ gsub (" ", "", [=11=]); print}'|awk 'BEGIN{FS=","; OFS=", "} {=; print "(" [=11=] ")"}')
# Re-buils full patterns
in_name=$func_name$in_par
mod_name=$func_name$in_par_mod
printf " Before : %-30s After : %-30s \n" "$in_name" "$mod_name"
# Generating script to be launched
if [ ! -z "$in_name" ]
then
printf "sed -i 's/%s/%s/g' %s \n " "$in_name" "$mod_name" "$in_file" >> sed_script.sed
else
printf "Line contains nothing to change \n"
fi
done < $in_file
运行 它产生:
Before : some_func(x, y,z) After : some_func(x, y, z)
Before : some_func_a(x, y, z, t ) After : some_func_a(x, y, z, t)
Before : some_func_b(x,y,z) After : some_func_b(x, y, z)
Before : some_func_z(x, y , z) After : some_func_z(x, y, z)
Before : some_func(x, y , z ) After : some_func(x, y, z)
Line contains nothing to change
Before : some_func( x, y) After : some_func(x, y)
Before : some_func_1(x) After : some_func_1(x)
Line contains nothing to change
Before : some_func(x, z, a, b,e) After : some_func(x, z, a, b, e)
Before : some_func_da(x, y,d, z) After : some_func_da(x, y, d, z)
Before : some_func_bla( x, y, z) After : some_func_bla(x, y, z)
Line contains nothing to change
Line contains nothing to change
并生成以下脚本:
sed -i 's/some_func(x, y,z)/some_func(x, y, z)/g' in.txt
sed -i 's/some_func_a(x, y, z, t )/some_func_a(x, y, z, t)/g' in.txt
sed -i 's/some_func_b(x,y,z)/some_func_b(x, y, z)/g' in.txt
sed -i 's/some_func_z(x, y , z)/some_func_z(x, y, z)/g' in.txt
sed -i 's/some_func(x, y , z )/some_func(x, y, z)/g' in.txt
sed -i 's/some_func( x, y)/some_func(x, y)/g' in.txt
sed -i 's/some_func_1(x)/some_func_1(x)/g' in.txt
sed -i 's/some_func(x, z, a, b,e)/some_func(x, z, a, b, e)/g' in.txt
sed -i 's/some_func_da(x, y,d, z)/some_func_da(x, y, d, z)/g' in.txt
sed -i 's/some_func_bla( x, y, z)/some_func_bla(x, y, z)/g' in.txt
对于改进此方法的任何帮助或评论,我将不胜感激。
我想在某些 fortran 程序中格式化函数调用的语法,但找不到满足我需要的方法。
源码中可能遇到的语法可以是:
func_example( x,y,z )
other_func_example(x,y,z, t)
another_one( x,y )
...
我需要的语法正是:
func_example(x, y, z)
other_func_example(x, y, z, t)
another_one(x, y)
...
我找到了一个完全删除花括号之间 spaces 的 sed 解决方案:
echo -e "function{x,y,z}\n function{ x,y,z}\n function{x,y,z }\n function{ x,y,z }"
| sed -e '/{/,/}/{s#\s*##g}'
这提供了:
function{x,y,z}
function{x,y,z}
function{x,y,z}
function{x,y,z}
这接近我的需要,但仍有问题:
- 不适用于标准括号。我应该以一种我无法到达的方式逃离他们。
- 在逗号 后不留下space
对于这方面的任何帮助,我将不胜感激。 Sed 在我看来是最好的选择。我也接受任何完整的 bash 或 awk 解决方案,但我想避免使用 perl,因为我对它几乎一无所知。
以下:
echo 'function( x,y,z )
function(x,y,z)
function(x, y,z)' |
sed 's/\(function\)([[:space:]]*\([a-z]*\)[[:space:]]*,[[:space:]]*\([a-z]*\)[[:space:]]*,[[:space:]]*\([a-z]*\)[[:space:]]*)/(, , )/'
输出:
function(x, y, z)
function(x, y, z)
function(x, y, z)
它:
- 匹配
function([a-z]*,[a-z]*,[a-z]*)
与所有标记之间任意数量的[[:space:]]*
个白色字符(空格、制表符)。 - 记住函数名和参数名,使用sed的
\(...\)
- 然后输出带有空格和逗号的标记
(, , )
- 请注意,它也适用于奇怪的输入,例如
function(,,)
- 如果您要格式化某些 C 代码,请使用
astyle
或indent
或为此创建的其他实用程序。
当你想先去掉逗号周围的空格时,你可以使用
... | sed -r 's/([(,]) *//g; s/ ([),])//g; s/,/, /g'
备选方案:您可以使用 tr
或简单的
... | sed 's/ //g; s/,/, /g'
我找到了一个可能不是最聪明的 awk 解决方案,但它适用于任意数量的昏迷。这个想法是生成一个脚本,其中包含一些要启动的 sed 命令。 我分享它以防它对某些人有任何帮助 reader.
输入测试文件:
some_func(x, y,z)
some_func_a(x, y, z, t )
some_func_b(x,y,z)
some_func_z(x, y , z)
some_func(x, y , z )
! some comment
some_func( x, y)
some_func_1(x)
some text
some_func(x, z, a, b,e)
some_func_da(x, y,d, z)
some_func_bla( x, y, z)
some_text without parenthesis
我得到的脚本是这样的:
while read line
do
# Gets what's in parenthesis and the function name
in_par=$(echo $line|awk -F "[()]" '/\(/{print "(" ")" }')
func_name=$(echo $line|awk -F "[()]" '/\(/{print }')
# Formats to my desired format
in_par_mod=$(echo $line|awk -F "[()]" '/\(/{print }'|awk '{ gsub (" ", "", [=11=]); print}'|awk 'BEGIN{FS=","; OFS=", "} {=; print "(" [=11=] ")"}')
# Re-buils full patterns
in_name=$func_name$in_par
mod_name=$func_name$in_par_mod
printf " Before : %-30s After : %-30s \n" "$in_name" "$mod_name"
# Generating script to be launched
if [ ! -z "$in_name" ]
then
printf "sed -i 's/%s/%s/g' %s \n " "$in_name" "$mod_name" "$in_file" >> sed_script.sed
else
printf "Line contains nothing to change \n"
fi
done < $in_file
运行 它产生:
Before : some_func(x, y,z) After : some_func(x, y, z)
Before : some_func_a(x, y, z, t ) After : some_func_a(x, y, z, t)
Before : some_func_b(x,y,z) After : some_func_b(x, y, z)
Before : some_func_z(x, y , z) After : some_func_z(x, y, z)
Before : some_func(x, y , z ) After : some_func(x, y, z)
Line contains nothing to change
Before : some_func( x, y) After : some_func(x, y)
Before : some_func_1(x) After : some_func_1(x)
Line contains nothing to change
Before : some_func(x, z, a, b,e) After : some_func(x, z, a, b, e)
Before : some_func_da(x, y,d, z) After : some_func_da(x, y, d, z)
Before : some_func_bla( x, y, z) After : some_func_bla(x, y, z)
Line contains nothing to change
Line contains nothing to change
并生成以下脚本:
sed -i 's/some_func(x, y,z)/some_func(x, y, z)/g' in.txt
sed -i 's/some_func_a(x, y, z, t )/some_func_a(x, y, z, t)/g' in.txt
sed -i 's/some_func_b(x,y,z)/some_func_b(x, y, z)/g' in.txt
sed -i 's/some_func_z(x, y , z)/some_func_z(x, y, z)/g' in.txt
sed -i 's/some_func(x, y , z )/some_func(x, y, z)/g' in.txt
sed -i 's/some_func( x, y)/some_func(x, y)/g' in.txt
sed -i 's/some_func_1(x)/some_func_1(x)/g' in.txt
sed -i 's/some_func(x, z, a, b,e)/some_func(x, z, a, b, e)/g' in.txt
sed -i 's/some_func_da(x, y,d, z)/some_func_da(x, y, d, z)/g' in.txt
sed -i 's/some_func_bla( x, y, z)/some_func_bla(x, y, z)/g' in.txt
对于改进此方法的任何帮助或评论,我将不胜感激。