![仅删除两个单词之间的空格](https://linux22.com/image/113852/%E4%BB%85%E5%88%A0%E9%99%A4%E4%B8%A4%E4%B8%AA%E5%8D%95%E8%AF%8D%E4%B9%8B%E9%97%B4%E7%9A%84%E7%A9%BA%E6%A0%BC.png)
我有以下内容
"/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'
那是:
"
在每个之前插入一个额外的<blanks>"
- 全部更改
<X>"<blanks>"<Y>"<blanks>"
为<X>"<blanks>"<Y>""
- 删除所有其他项
"
以撤消 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