我正在尝试使用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";
也就是说,省去骆驼文本的前导引号,这样,如果通过分割骆驼文本来添加前导空格,则将在=后面添加这无关紧要。然后在分割骆驼文本后添加引号。
答案 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'
这个想法是应用重复的替换(:a
和ta
),在其中匹配您不想更改的部分([^=]+
),然后在小写字母之间插入一个空格字母,后跟大写字母([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: "
$