【问题标题】:Unix shell - Best way to replace all occurrence of whitespace in stringUnix shell - 替换字符串中所有出现的空格的最佳方法
【发布时间】:2017-12-03 07:45:11
【问题描述】:

我有一个类似的字符串

'abc', '<<some string with space>>', 'xyz'

我想得到如下字符串:-

'abc', '<<some_string_with_space>>', 'xyz'

【问题讨论】:

  • 换行符是一个空格——你引用的字符串可以包含换行符吗?是否可以包含转义引号(\''')?它可以包含逗号吗?你能有一个空字段''吗?目标字符串真的是否总是以&lt;&lt; 开头并以&gt;&gt; 结尾?努力提出涵盖所有用例的简洁、可测试的示例输入和预期输出,这样我们就不会猜测您的要求。

标签: bash shell awk sed


【解决方案1】:

你也可以使用 sed

echo "'abc', '<<some string with space>>', 'xyz'" | sed s'/ /_/g;s/,_/, /g'

【讨论】:

  • echo "'hello, world'" | sed s'/ /_/g;s/,_/, /g' 怎么样?
  • @gniourf_gniourf,是的,你是对的,如果它总是在 > 中,我们可以使用 sed -E ':A;s/(
【解决方案2】:

只需 awk

s="'abc', '<<some string with space>>', 'xyz'"
awk -F', ' '{ gsub(/[[:space:]]+/,"_",$2) }1' OFS=', ' <<<"$s"

输出:

'abc', '<<some_string_with_space>>', 'xyz'

【讨论】:

  • s="'hello, world'" 怎么样?
  • @RomanPerekhrest,当字符串在“,”之间没有空格时,它不起作用。 s="'abc','>','xyz'"
  • @gniourf_gniourf,如何详细说明所有可能的输入?我们有一个具体案例
  • @AbhashUpadhyaya,您应该在问题中提到这一点。更准确
  • @RomanPerekhrest,我可以通过一些调整来做到这一点。如果我提前知道所有情况,我会提到所有情况。谢谢:)
【解决方案3】:

如果您的问题涉及用_ 替换空格的普遍问题仅在单引号字符串'...' 内而不是在其他部分, 我会使用 Perl 解决这个问题,遵循以下逻辑:

  • 对于输入中的每个'...'(使用正则表达式:'[^']+'
  • 执行一个函数,将所有空格替换为_

像这样:

echo "'abc', '<<some string with space>>', 'xyz'" |\
  perl -pe 'sub r { $_ = @_[0]; s/ +/_/g; return $_; }; s/'"'[^']+'"'/r($&)/ge'

【讨论】:

    【解决方案4】:

    这可能对你有用(GNU sed):

    sed ":a;s/^\(\('[^']*',\s*\)*'[^' ]*\) /\1_/;ta" file
    

    或者更安全:

    sed ':a;s/^\(\('\''[^'\'']*'\'',\s*\)*'\''[^'\'' ]*\) /\1_/;ta' file
    

    【讨论】:

      【解决方案5】:

      使用 awk 的 gsub 和正则表达式 \s 来替换空白字符。

      mystr = "my sentence is this!"
      gsub(/\s/,"_",mystr)
      print mystr
      

      【讨论】:

      • 我没有投反对票,但你应该提到的是 GNU awk 仅适用于 \s - 以及你需要的其他 awk [[:space:]]
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2011-03-25
      相关资源
      最近更新 更多