在sed中拆分第二次出现的骆驼样式文本的样式

时间:2019-02-06 22:09:08

标签: macos awk sed

我正在尝试使用sed和awk为mac应用程序创建键,值字符串表。到目前为止,我已经掌握了以下内容:

"exif:DateTimeOriginal" = "DateTimeOriginal:\t";

我想做最后一步:

"exif:DateTimeOriginal" = "Date Time Original:\t";

换句话说,将第二次出现的骆驼文本分割开。 我见过这样的sed:

sed 's/\([A-Z]\)/ \1/g'

哪个会全局执行,然后使用以下方法执行第二次匹配:

sed 's/\([A-Z]\)/ \1/2g'

还是第三次出现。但是,不幸的是,在macOS上,您无法将数字与g命令结合使用。

那么还有另一种方法吗?

顺便说一句,我可以做到,这样您就可以从以下开始:

"exif:DateTimeOriginal" = DateTimeOriginal:\t";

也就是说,省去骆驼文本的前导引号,这样,如果通过分割骆驼文本来添加前导空格,则将在=后面添加这无关紧要。然后在分割骆驼文本后添加引号。

5 个答案:

答案 0 :(得分:1)

使用GNU awk(不是操作系统的默认设置)。

$ awk -F'"' -v OFS='"' '{$4=gensub(/([^A-Z])([A-Z])/,"\\1 \\2","g",$4)}1' file

"exif:DateTimeOriginal" = "Date Time Original:\t";

根据您的语言环境,您可能需要[:lower:]或[:upper:] char类。

答案 1 :(得分:1)

使用任何POSIX awk:

$ awk 'BEGIN{FS=OFS="\""} {gsub(/[[:upper:]]/," &",$4); sub(/^ /,"",$4)} 1' file
"exif:DateTimeOriginal" = "Date Time Original:\t";

答案 2 :(得分:1)

以下是使用sed的方法:

sed -E -e ':a' -e 's/^([^=]+)= (.*)([a-z])([A-Z])/\1= \2\3 \4/' -e 'ta'

这个想法是应用重复的替换(:ata),在其中匹配您不想更改的部分([^=]+),然后在小写字母之间插入一个空格字母,后跟大写字母([a-z][A-Z])。

答案 3 :(得分:1)

这可能对您有用(GNU sed):

sed 'h;s/\B[[:upper:]]/ &/g;H;x;s/=.*=/=/' file

复制当前行。

在一个单词的所有大写字母之前插入一个空格。

将结果追加到原始行。

删除原始行的尾部和结果的开头。

答案 4 :(得分:0)

使用Perl

$ echo '"exif:DateTimeOriginal" = DateTimeOriginal:\t"' | perl -F'"' -lane ' $F[2]=~s/(?=[A-Z])/ /g;$F[2]=~s/\s+=\s+/=\"/g; print "\"$F[1]\"$F[2]\"" '
"exif:DateTimeOriginal"="Date Time Original:    "
$