我需要在一个大的文本文件中替换所有出现的,例如'yw234DV w-23-sDf wef23s-d-f'
具有相同的字符串,但使用下划线而不是引号内的所有空格的空格,而不替换带引号的引号之外的任何空格。
我正在尝试在vim中找到替代解决方案,但也非常感谢sed解决方案。每个以引号分隔的字符串中的标记数可能会有所不同。
我一直在玩vim中的一些正则表达式,但它们非常基本,似乎缺少我需要的东西。
我目前的尝试:
%s/'{[:alnum:] }*/'\0\_/g
而我正在尝试各种变化。
这与我的问题最相似,尽管它是Java:Replacing spaces within quotes
样本输入:
'wiUEF7-gvouw ow wo24-RTeih we', 'yt23IT iug-76'
样本输出:
'wiUEF7-gvouw_ow_wo24-RTeih_we', 'yt23IT_iug-76'
您可以尝试使用VIM,在Macvim上尝试这个:
%s/\%('[^']*'\)*\('[^']*'\)/\=substitute(submatch(1), ' ', '_', 'g')/g
更简单的解决方案,感谢@SergioAraujo:
@%s/\v%(('[^']*'))/\=substitute(submatch(1),' ', '_', 'g')/g
然而,不确定,如果以下是你预期的结果输出:
'wiUEF7-gvouw_ow_wo24-RTeih_we', 'yt23IT_iug-76'
在perl中:
perl -i -pe's{(\x27.*?\x27)}{ (my $subst = $1) =~ tr/ /_/ }ge' yourfile
或者使用perl5.14或更高版本:
perl -i -pe's{(\x27.*?\x27)}{ $1 =~ tr/ /_/r }ge'
有了这个输入文件:
$ cat file
'wiUEF7-gvouw ow wo24-RTeih we', 'yt23IT iug-76'
我们可以将单引号内的所有空格转换为下划线:
$ sed -E ":a; s/^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]/\1_/; ta" file
'wiUEF7-gvouw_ow_wo24-RTeih_we', 'yt23IT_iug-76'
:a
这会创建一个标签a
。s/^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]/\1_/
这会将下划线插入到我们想要的位置。
^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]
这将查找任何奇数个单引号,后跟任意数量的非引号字符,后跟空格。该空间之前的所有内容都保存在第1组中。
\1_
这将匹配的文本替换为组1,后跟下划线。ta
如果上一个命令在字符串中放入任何新的下划线,则跳回标签a
并再试一次。在FPAT
中使用gnu awk
变量,你可以这样做:
awk -v OFS=', ' -v FPAT="'[^']*'" '{for (h=1; h<=NF; h++)
{gsub(/[[:blank:]]/, "_", $h); printf "%s%s", $h, (h < NF ? OFS : ORS)}}' file
'wiUEF7-gvouw_ow_wo24-RTeih_we', 'yt23IT_iug-76'