如何使用sed替换"\ "(反斜杠+空格)?

4
在bash脚本中,文件名中有空格时会显示为"File\ with\ spaces.txt",我想用_+替换这些斜杠空格。如何告诉sed实现这一点?我尝试使用以下命令但没有成功:
$1=~/File\ with\ spaces.txt
ext=$1
web=$(echo "$ext" | sed 's/\ /+/')

如果有比使用sed更好的方法,我愿意听取建议。

[编辑]: Foo Bah的解决方案很好,但它只替换第一个空格,因为其后的文本被视为参数而不是$1的一部分。有没有什么办法可以解决这个问题?

4个回答

3
sed 's/\\\\ /+/';

\\\\ 在 shell 级别上评估为 \\,然后在 sed 中转换为文字字面量 \


2
如果你用双引号,那么你就是对的。因为你使用了单引号,Shell 没有去掉反斜杠的一层。 - Jonathan Leffler

2

Sed正常识别\作为空格:

bee@i20 ~ $ echo file\ 123 | sed 's/\ /+/'
file+123

你的bash脚本语法完全错误。虽然不确定你尝试使用脚本做什么,但这里有一个用+替换空格的示例:

ext=~/File\ with\ spaces.txt
web=`echo "$ext" | sed 's/\ /+/g'`
echo $web

更新: 哦,你需要g标志来替换所有空格的出现,而不仅仅是第一个。已经在上面进行了修复。


好的,只需要将第一行替换为ext=$1。然后使用适当的参数运行即可。 - thule
然而,这仅替换第一个空格。之后,被分隔的单词将被视为参数。 - octosquidopus
太好了!这一切都与 g 有关 :) 非常感谢! - octosquidopus
一个简单的替代方法是使用 tr 命令:https://dev59.com/mXM_5IYBdhLWcg3wvFzJ#1252010 即 tr --delete '\\\n' - Danny Varod

2

您想转义斜杠:

web=$(echo "$ext" | sed 's/\\ /_/g')

不,那是错误的。那会替换实际的反斜杠+空格。 - thule
这就是问题(或问题标题)所要求的 - bash的输出包括反斜杠,反斜杠+空格的组合需要替换为下划线。另一方面,我想问题(问题正文)可能并不确定它需要什么。 - Jonathan Leffler
letitbee的解决方案最好。sed 's/\ /+/g'就是我要找的。 - octosquidopus

0

单引号是你的好朋友 应该使用单引号参数来处理$1和$2

#!/bin/bash
ESCAPE='\\'
if [ $# -ne 2 ];then   
  echo "$0 <TO_ESCAPE> <IN_STRING>"
  echo args should be in single quotes!! 
  exit 1
fi

TO_ESCAPE="${1}"
IN_STRING="${2}"

if [ ${TO_ESCAPE} = '\' ];then
  TO_ESCAPE='\\'
fi
echo "${IN_STRING}" | sed "s/${TO_ESCAPE}/${ESCAPE}${TO_ESCAPE}/g"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接