awk/sed脚本将文件从camelCase转换为下划线

Cor*_*rel 13 bash awk camelcasing sed

我想将项目中的几个文件转换camelCaseunderscore_case.

我想有一个只需要文件名才能工作的在线人.

Avi*_*Raj 20

你也可以使用sed.

$ echo 'fooBar' | sed -r 's/([a-z0-9])([A-Z])/\1_\L\2/g'
foo_bar
$ echo 'fooBar' | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\L\2/g'
foo_bar
Run Code Online (Sandbox Code Playgroud)

  • 不适用于我(OS X El Capitan)所以我使用了perl:`echo'fooBar'| perl -pe's /([a-z0-9])([AZ])/ $ 1_\L $ 2/g'` (6认同)
  • 这是GNU sed - http://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html#The-_0022s_0022-Command - 但不是POSIX - http://pubs.opengroup .org/onlinepubs/9699919799/utilities/sed.html - 所以这取决于你拥有(或更喜欢)的风味. (2认同)

Cor*_*rel 5

经过几次不成功的尝试后,我得到了这个(为了可读性我把它写在几行上,但我们可以删除换行符以获得在线):

awk -i inplace '{
  while ( match($0, /(.*)([a-z0-9])([A-Z])(.*)/, cap)) 
    $0 = cap[1] cap[2] "_" tolower(cap[3]) cap[4];

  print
}' FILE
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我们可以修改它来做相反的事情(对 CamelCase 下划线):

awk -i inplace '{
  while ( match($0, /(.*)([a-z0-9])_([a-z])(.*)/, cap))
    $0 = cap[1] cap[2] toupper(cap[3]) cap[4];

  print
}' FILE
Run Code Online (Sandbox Code Playgroud)

如果您想知道,-i inplaceis a 标志仅适用于 awk >=4.1.0,并且它就地修改文件(与 一样sed -i)。如果您的 awk 版本较旧,则必须执行以下操作:

awk '{...}' FILE > FILE.tmp && mv FILE.tmp FILE
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人!

  • match() 的第三个参数是 gawk 特定的,就像 `-i inplace` 一样。 (2认同)

小智 5

建议的sed答案存在一些问题:

$ echo 'FooBarFB' | sed -r 's/([a-z0-9])([A-Z])/\1_\L\2/g'
Foo_bar_fB
Run Code Online (Sandbox Code Playgroud)

我建议以下

$ echo 'FooBarFB' | sed -r 's/([A-Z])/_\L\1/g' | sed 's/^_//'
foo_bar_f_b
Run Code Online (Sandbox Code Playgroud)

  • 您可以将两个 `sed` 调用分组为一个: `sed 's/\([AZ]\)/_\L\1/g;s/^_//'` (2认同)