当我匹配所有字符时,在SED中逃脱〜

时间:2017-01-10 12:25:53

标签: regex bash sed

我试图替换一个以〜终止的CSV中的字符串,它就像一个密码,我想逃脱分隔符停止。

我用:

ORIGINAL ARGUMENTS:
semicolon;lost "some  spaces " "semicolon;kept",  no,comma  "a,comma"
PARSED ARGUMENTS (EACH ENCLOSED IN ""):
"semicolon"
"lost"
"some  spaces "
"semicolon;kept"
"no"
"comma"
"a,comma"

它很好但sed -i "s/\(z.*\~\)/\"\1\"/g" 没有被转义,正则表达式进入最后一行。

是否有某种方式停止"匹配使用~

停止的任何字符

这些是我的例子。第二部分是正确的,因为我想双引用子表达式:

~

我想拥有(或停止)

zTG*?KM)ии*v=?~~~~~
zTG*?KMии$FhB?~S~~~~

但是在顶部有de word命令我有:

"zTG*?KM)ии*v=?"~~~~~
"zTG*?KMии$FhB?"~S~~~~

3 个答案:

答案 0 :(得分:4)

$ cat ip.csv 
zTG*?KM)ии*v=?~~~~~
zTG*?KMии$FhB?~S~~~~

$ sed -i 's/z[^~]*/"&"/g' ip.csv 
$ cat ip.csv
"zTG*?KM)ии*v=?"~~~~~
"zTG*?KMии$FhB?"~S~~~~
  • z[^~]*字符z后跟零个或多个非~个字符。由于*是贪婪的量词,它会尝试尽可能多地匹配
  • "&"在匹配的模式周围添加引号
  • 注意:如果行中只有一个匹配项,则不需要g修饰符

答案 1 :(得分:1)

@Oriol,请你试试看,如果这对你有所帮助,请告诉我。

awk '{sub(/~/,s1"&");sub(/^/,s1);print}' s1="\""  Input_file

答案 2 :(得分:0)

echo 'zTG*?KM)ии*v=?~~~~~' | sed -En 's|([^~]+)|"\0"|p'

结果:"zTG*?KM)ии*v=?"~~~~~ 它对我有用。