仅删除两个单词之间的空格

仅删除两个单词之间的空格

我有以下内容

"/x/x y/asfas/g.pdf          " "fdfdf
"/x/y/yy    y/d.doc    " "fdfdf
etc..

我想删除扩展名和 " ONLY 之间的空格

当我用来tr删除尾随空格时,它会删除之间超过 1 个空格的空格(例如:yy y变为yy y

答案1

GNUsed方法:

sed 's/\([^.]*\.[^."[:space:]]*\)[[:space:]]\+"/\1"/' file

  • \([^.]*\.[^."[:space:]]*\)- 第一个捕获的组包含带有扩展名的假设文件名

  • [[:space:]]\+"- 确保之间至少有一个空格扩大"

答案2

你可以这样做:

sed 's/\(\.[^"[:blank:]]*\)[[:blank:]]*"/\1"/g'

即删除后面的空白序列,.后跟一系列非空白或非字符序列",然后是"

删除每个前面的空格其他每行都有双引号字符,您可以执行以下操作:

sed 's/[[:blank:]]*"/"&/g
     s/\(\([^"]*"\)\{3\}\)[[:blank:]]*"/\1"/g
     s/"\([^"]*"\)/\1/g'

那是:

  1. "在每个之前插入一个额外的<blanks>"
  2. 全部更改<X>"<blanks>"<Y>"<blanks>"<X>"<blanks>"<Y>""
  3. 删除所有其他项"以撤消 1 中的插入

或者以更直接的方式awk

awk -F \" -v OFS=\" '
  {
    for (i = 2; i <= NF; i += 2 )
      sub(/[[:blank:]]*$/, "", $i)
    print
  }'

请注意,除非您使用该选项,tr否则不会挤压字符。-s更有可能的是,您忘记引用包含 的输出的参数扩展或命令替换tr

无论如何,tr不​​能用于该任务。它只是一个音译工具。它所能做的就是翻译/删除/挤压全部空格字符。它不能仅翻译/删除/挤压一些空格字符。

答案3

使用 GNU sed。搜索一个或多个空格,后跟双引号。将其替换为双引号:

sed -i -e 's/ \+"/"/' file

或者像这样,由您选择:

sed -i -e 's/[[:space:]]\+"/"/' file

相关内容