【问题标题】:How to insert space between characters after some specific symbols?如何在某些特定符号后的字符之间插入空格?
【发布时间】:2021-12-15 15:24:27
【问题描述】:

我有一个格式如下的文本文件:

\Hollands\\\\\\hOlAnz/hOlAns\\\\\\\\
\Hollandse\\\\\\hOlAns@\\\\\\\\
\Hollywood\\\\\\hOliwud/hOliwut/hOliwYd\\\\\\\\
...

我想让它看起来像这样⬇️:

\Hollands\\\\\\h O l A n z / h O l A n s\\\\\\\\
\Hollandse\\\\\\h O l A n s @\\\\\\\\
\Hollywood\\\\\\h O l i w u d / h O l i w u t / h O l i w Y d\\\\\\\\

我该怎么办? 非常感谢。

我尝试使用 sed:

sed 's/\{\\\\\\\{1\}\)/\1 /g'

因为我期望在{1\}(每个字符)之后插入\1 /(一个空格),在6个重复的\s之后。 但收到错误提示

RE error: invalid repetition count(s)

【问题讨论】:

  • 请注意,当您不将-r 传递给sed 时,它使用BRE 而不是ERE 语法。这会改变反斜杠在 { 之前的解释方式。但是,除此之外,还不清楚您运行的 sed 命令如何具有您想要的行为。
  • 重复操作符是修饰符。当使用 sed-r 参数启用 ERE 语法时,{1} 并不意味着“任何一个字符”,它意味着“正好是前面的字符之一”(这使它成为空操作,因为当您没有另外指定,anything 应该完全匹配其中一个)。因此,“任何字符中的一个”可以写成.{1},但这与. 完全相同——完全没有理由使用{1}。 (当 ERE 语法 启用并且您使用 sed 的默认 BRE 时,{1} 改为 \{1\}

标签: bash shell awk sed


【解决方案1】:

sed 是对单个字符串执行简单的s/old/new/ 操作的正确工具,除此之外(例如,隔离字符串的一部分,然后根据需要对该字符串的某些部分进行进一步操作),只需使用 awk .

使用 GNU awk 作为第三个参数来 match() 和 gensub():

$ awk 'match($0,/(.*\\{6}.)(.*)(\\{8})/,a) { $0=a[1] gensub(/./," &","g",a[2]) a[3] } 1' file
\Hollands\\\\\\h O l A n z / h O l A n s\\\\\\\\
\Hollandse\\\\\\h O l A n s @\\\\\\\\
\Hollywood\\\\\\h O l i w u d / h O l i w u t / h O l i w Y d\\\\\\\\

【讨论】:

    【解决方案2】:

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

    sed -E 's/(\\{6}[^\\])(.*\\{8})/\1 \n\2/;:a;s/\n([^\\])/\1 \n/;ta;s/ \n//' file
    

    开启扩展正则表达式-E

    对于所有行,使用模式匹配在六个 \ 之后插入一个空格和唯一分隔符 (\n)。

    用以下字符、空格和换行符重复替换换行符和后续字符,直到下一次出现 \

    删除最后一个空格和换行符并打印结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多