sed 如何替换“\” (反斜杠+空格)?

发布于 2024-12-04 00:35:44 字数 365 浏览 0 评论 0原文

在 bash 脚本中,带有空格的文件显示为 "File\ with\spaces.txt",我想用 _替换这些斜杠空格+。

我怎样才能告诉 sed 这样做呢?我没有成功使用;

$1=~/File\ with\ spaces.txt
ext=$1
web=$(echo "$ext" | sed 's/\ /+/')

如果有比 sed 更好的方法,我愿意接受建议。

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

In a bash script, files with spaces show up as "File\ with\ spaces.txt" and I want to substitute those slashed-spaces with either _ or +.

How can I tell sed to do that? I had no success using;

$1=~/File\ with\ spaces.txt
ext=$1
web=$(echo "$ext" | sed 's/\ /+/')

I'm open to suggestions if there's a better way than through sed.

[EDIT]: Foo Bah's solution works well, but it substitutes only the first space because the text following it is treated as arguments rather than part of the $1. Any way around this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

跨年 2024-12-11 00:35:44
sed 's/\\\\ /+/';

\\\\ 在 shell 级别计算为 \\,然后在 sed 中计算为文字 \

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

\\\\ evaluates to a \\ at the shell level, and then into a literal \ within sed.

不离久伴 2024-12-11 00:35:44

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 标志来替换所有出现的空格,而不仅仅是第一个。已修复如上。

Sed recognises \ as space just fine:

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

Your bash script syntax is all wrong, though.
Not sure what you were trying to do with the script, but here is an example of replacing spaces with +:

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

Upd:
Oh, and you need the g flag to replace all occurences of space, not only the first one. Fixed above.

风吹雨成花 2024-12-11 00:35:44

你想逃避斜杠:

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

you want to escape the slash:

web=$(echo "$ext" | sed 's/\\ /_/g')
夏夜暖风 2024-12-11 00:35:44

单引号是你的朋友
以下内容应与 $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"

single quotes are your friend
the following should be used with single quoted args for $1 and $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"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文