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

问题描述 投票:1回答:4

我需要在一个大的文本文件中替换所有出现的,例如'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'
regex vim sed substitution
4个回答
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'

3
投票

在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'

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'  

How it works

  1. :a 这会创建一个标签a
  2. s/^(([^']*'[^']*')*[^']*'[^']*)[[:space:]]/\1_/ 这会将下划线插入到我们想要的位置。 ^(([^']*'[^']*')*[^']*'[^']*)[[:space:]] 这将查找任何奇数个单引号,后跟任意数量的非引号字符,后跟空格。该空间之前的所有内容都保存在第1组中。 \1_ 这将匹配的文本替换为组1,后跟下划线。
  3. ta 如果上一个命令在字符串中放入任何新的下划线,则跳回标签a并再试一次。

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'
© www.soinside.com 2019 - 2024. All rights reserved.