我需要在大型文本文件中替换所有出现的内容,例如'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'
答案 0 :(得分:4)
您可以尝试使用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'
答案 1 :(得分:3)
在perl:
perl -i -pe's{(\x27.*?\x27)}{ $1 =~ tr/ /_/r }ge'
或使用perl5.14或更高版本:
{{1}}
答案 2 :(得分:1)
使用此输入文件:
$ 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
并重试。
答案 3 :(得分:1)
在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'