用引号内的下划线替换空格

时间:2018-01-01 05:58:23

标签: regex vim sed substitution

我需要在大型文本文件中替换所有出现的内容,例如'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'

4 个答案:

答案 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'  

如何运作

  1. :a

    这会创建一个标签a

  2. s/^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]/\1_/

    这会将下划线插入到我们想要的位置。

    • ^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]

      这会查找任何奇数的单引号,后跟任意数量的非引号字符,后跟空格。该空间之前的所有内容都保存在第1组中。

    • \1_

      这将匹配的文本替换为组1,后跟下划线。

  3. 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'