我有"我爱苏西并结婚",我想把"苏西"改成"萨拉"。

#!/bin/bash

firstString="I love Suzi and Marry"

secondString="Sara"

# do something...

结果必须如下:

firstString="I love Sara and Marry"

要用给定的字符串替换模式的第一个匹配项,请使用${parameter/pattern/string}:

#!/bin/bash

firstString="I love Suzi and Marry"

secondString="Sara"

echo"${firstString/Suzi/$secondString}"

# prints 'I love Sara and Marry'

要替换所有事件,请使用${parameter//pattern/string}:

message='The secret code is 12345'

echo"${message//[0-9]/X}"

# prints 'The secret code is XXXXX'

(这记录在bash参考手册和第3.5.3节"shell参数扩展"中。)

请注意,这个特性不是由posix指定的,它是bash扩展,因此并非所有的unix shell都实现它。有关POSIX的相关文档,请参阅OpenGroup技术标准基本规范,第7期,Shell&utilities卷,以及第2.6.2节"参数扩展"。

@Ruakh我该如何写这个带有或条件的语句。如果我想取代苏子或嫁给新的字符串。

@Priyatham51:没有内置的功能。先换一个,然后换另一个。

@谢谢你的回复。我昨天已经这样做了,我只是想和你确认一下,如果有选择的话,这样我就不必写两行代码了。:)

将"n"(换行符)替换为"

"(HTML换行符)是否有效?$STRING="${STRING/

/

}"

@布鲁:不,因为在这种情况下,将代表自己,而不是一个新行。我现在没有现成的bash来测试,但您应该能够编写类似于$STRING="${STRING/$'

'/

}"的东西。(尽管你可能想用STRING//--全部替换--而不是仅仅用STRING/.)。

如果原始字符串包含"/home/user/dir/",我想将"/home/usr"替换为"/home"(获取结果"/home/dir/")?我如何才能摆脱"/"本身的含义?

@Deniomariz:foo=/home/user/dir,后面是echo"${foo/\/home\/user//home}",将打印/home/dir。

要清楚,因为这让我有点困惑,第一部分必须是一个变量引用。你不能做echo ${my string foo/foo/bar}。你需要input="my string foo"; echo ${input/foo/bar}。

@ruakh-mary通常用一个r:d拼写。

@JobJob:谁在乎"通常"的拼写?这首诗写的是《江户记》(12),故事的结尾。

@哦,该死的-他们就这么做了!我的道歉,应该是对手术的评论。要清楚的是-只是有点笑:d

@Deniomariz我有foo ="$(pwd)"和bar="/test/",我现在怎么用echo"${foo/bar/profi/}"

注意:如果替换字符串包含斜杠,只需转义它们。path=/home/me/docs; echo"${path/me\/docs/you\/docs}"

@这是我的用例

这完全可以通过bash字符串操作完成:

first="I love Suzy and Mary"

second="Sara"

first=${first/Suzy/$second}

这将只替换第一个匹配项;要全部替换,请将第一个斜杠加倍:

first="Suzy, Suzy, Suzy"

second="Sara"

first=${first//Suzy/$second}

# first is now"Sara, Sara, Sara"

有一个重复接受的答案,而不是用全局替换选项编辑接受的答案,这有什么意义呢?并添加了regexps在执行时受支持。并解释"糟糕的替换"是怎么回事。你有足够的分数,@kevin:)

试试这个:

sed"s/Suzi/$secondString/g" <<

实际上您不需要SED;bash支持这种本地替换。

我猜这是标记为"bash"的,但之所以出现在这里,是因为需要为另一个shell做一些简单的事情。与wiki.ubuntu.com/&hellip;让它看起来像是我需要的东西相比,这是一个很好的简洁的选择。

这对ash/dash或任何其他posix sh都很有用。

我得到错误的sed:-e表达式1,char 9:未知选项到's

@事实上,我发现这对干草堆串很大的情况很有用。另一个选择是我得到了zsh: command too long。

第一个适用于stdin的答案,非常适合于管道字符串。

@这个答案适用于管道。像my_command | sed ... | ...一样

@namgvu或其他任何出现此错误的人,通常意味着搜索或替换节中的一个字符串与分隔符具有相同的字符。例如,通常使用/作为分隔符,但如果字符串包含*nix目录,则会看到该错误,因为它们也具有/字符。

如果字符串有regexp字符,那么使用bash比使用sed要好。

echo ${first_string/Suzi/$second_string}

它可移植到Windows中,至少与bash 3.1一样旧。

为了证明你不需要太担心逃跑,让我们来看看:

/home/name/foo/bar

进入这个:

~/foo/bar

但前提是/home/name是在开始的时候。我们不需要sed!

考虑到bash给了我们神奇的变量$PWD和$HOME,我们可以:

echo"${PWD/#$HOME/\~}"

编辑:感谢Mark Haferkamp对引用/转义~注释的评论。*

注意变量$HOME如何包含斜线,但这并没有破坏任何东西。

进一步阅读:高级bash脚本指南。如果必须使用sed,请确保转义每个字符。

这个答案阻止了我使用sed和pwd命令,以避免每次运行自定义$PS1时定义一个新变量。bash是否提供了比magic变量更通用的方法来使用命令的输出来替换字符串?至于您的代码,我必须避开~,以防止bash将其扩展到$home。还有,你指挥的江户十一〔四〕是做什么的?

@markhaferkamp从"进一步阅读建议"链接中查看。关于"逃离~":注意我是如何引用这些东西的。记住总是引用一些东西!这不仅仅适用于magic变量:任何变量都可以在bash中进行替换、获取字符串长度等等。恭喜您尝试快速使用$PS1:如果您对另一种编程语言更熟悉,并且希望对编译后的提示进行编码,那么您也可能对$PROMPT_COMMAND感兴趣。

"进一步阅读"链接解释了""。在bash 4.3.30上,echo"${PWD/#$HOME/~}"没有用~替换我的$HOME。用\~或'~'工程代替~。在另一个发行版上的bash 4.2.53上的任何这些工作。为了更好的兼容性,您能更新您的文章来引用或退出~吗?我的"魔法变量"问题的意思是:我可以在不首先将其保存为变量的情况下,在uname的输出上使用bash的变量替换吗?至于我的个人$PROMPT_COMMAND,这很复杂。

@马克哈弗坎普,哇,你完全是对的,我的错。将立即更新答案。

我好像错了……实际上,在chakra linux和opensuse之间重新启动(而不是chrooting)表明,${PWD/#$HOME/~}在suse上的bash 4.2.53中工作,${PWD/#$HOME/\~}在chakra上的bash 4.3.30中工作,但反之则不一样。在两个发行版上都有效的解决方法是用$(echo '~')替换~,就像在冗长的${PWD/#$HOME/$(echo '~')}中一样。编辑:我刚意识到$'~'可能更好。我正在测试它。

请忽略我以前评论中的编辑。$'~'在echo命令中效果很好,但是当我试图用它在$ps1中得到一个文本~时,只引起了我的沮丧。$(echo '~')似乎是最好的解决方法。

@马克哈费尔坎普巴什及其模糊的陷阱…P

对于dash,所有以前的帖子都不起作用

posix sh兼容的解决方案是:

result=$(echo"$firstString" | sed"s/Suzi/$secondString/")

我收到这个:$echo$(echo$firststring sed's/suzi/$secondstring/g),我爱$secondstring并结婚。

@qstnr_la使用双引号替换变量:result=$(echo $firstString | sed"s/Suzi/$secondString/g")。

加1表示如何输出到变量。谢谢!

我修复了单引号,并在echo参数周围添加了缺失的引号。它可以在不引用简单字符串的情况下进行欺骗,但很容易在任何重要的输入字符串(不规则间距、shell元字符等)上中断。

在sh(aws codebuild/ubuntu sh)中,我发现在末尾需要一个斜线,而不是一个双斜线。我将编辑注释,因为上面的注释也显示一个斜线。

如果明天你决定不爱结婚,她也可以被取代:

today=$(

tomorrow="${today//Suzi/Sara}"

echo"${tomorrow//Marry/Jesica}"> /tmp/lovers.txt

必须有50种方法离开你的爱人。

是的,你是对的!

纯posix shell方法与基于Roman Kazanovskyi的sed的答案不同,它不需要外部工具,只需要shell自己的本地参数扩展。请注意,长文件名被最小化,因此代码更适合一行:

f="I love Suzi and Marry"

s=Sara

t=Suzi

["${f%$t*}" !="$f" ] && f="${f%$t*}$s${f#*$t}"

echo"$f"

输出:

I love Sara and Marry

它是如何工作的:

删除最小后缀模式。如果后缀$t中的"Suzi*在$f中,I loveSuzi and Marry中,"${f%$t*}"返回"EDOCX1〔13]。

但如果t=Zelda,则"${f%$t*}"不删除任何内容,并返回整个字符串"I love Suzi and Marry"。

用于测试$t是否在$f中,["${f%$t*}" !="$f" ]是否在$f中,如果$f字符串包含"Suzi*则评估为真,否则评估为假。

如果测试返回true,则使用删除最小后缀模式${f%$t*}"I love"构造所需字符串,并删除最小前缀模式${f#*$t}"and Marry",其中第二个字符串$s"Sara"。

因为我不能添加评论。@Ruaka为了使示例更易读,请这样写

full_string="I love Suzy and Mary"

search_string="Suzy"

replace_string="Sara"

my_string=${full_string/$search_string/$replace_string}

or

my_string=${full_string/Suzy/Sarah}

linux shell 字符串替换字符,关于bash:在shell脚本中替换另一个字符串的一个子字符串...相关推荐

  1. Linux JAVA执行source,linux 下source、sh、bash、./执行脚本的区别

    1.source命令用法: source  FileName 作用:在当前 bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通 ...

  2. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  3. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  4. 在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...

  5. C++ 取json中的某一个值,解析json字符串

    C++ 取json中的某一个值,解析json字符串 C++编程中遇到了需要经常从json中取某一项,又不想用json库文件实现,只能靠自己封装方法 例如这个json {"date" ...

  6. linux shell脚本中调用另一个shell脚本

    先来说一下主要以下有几种方式: 1.fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. 2.exec: exec path/to/foo. ...

  7. java用if判断输入字符_JAVA中如何判断一个输入是数字还是字符串

    展开全部 1.使用Character.isDigit(char)判断 String str = "123abc"; if (!"".equals(str)) { ...

  8. 【linux】Shell脚本中调用另外一个脚本的方法

    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一 ...

  9. linux fork脚本,在Shell脚本中调用另一个脚本的三种方式讲解

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...

最新文章

  1. iOS进阶之底层原理-应用程序加载(dyld加载流程、类与分类的加载)
  2. 书脊开胶了用什么胶粘_画册印制1万本,结果一本不能用,这些问题你注意了吗...
  3. MSSQL 判断表是否存在的两种方法
  4. C++不同数据类型的转换
  5. postgres+socket.io+nodejs实时地图应用实践
  6. 自动化构建之bower
  7. 第二阶段团队冲刺(五)
  8. lenet5卷积神经网络_tensorflow图像识别入门实战:使用LeNet5模型实现猫狗分类
  9. struts环境搭建以及登陆功能的书写
  10. 第一章:WTL的5个W
  11. android 获取已安装的应用大小,Android获得已安装应用大小
  12. 关于python 输出中文
  13. won10qualcomm atheros无线网卡驱动安装不了
  14. Docker-07:Docker网络管理
  15. 辛意云教授讲《论语》
  16. 实录丨戴琼海:深度学习遭遇瓶颈,全脑观测启发下一代AI算法
  17. html css alpha,CSS滤镜之alpha属性-网页设计,HTML/CSS
  18. input实现文字超出省略号功能
  19. Excel表计算两个时间段之间的总月数、折算年限公式
  20. caffe-ristretto:可以定点的层目录

热门文章

  1. Dede后台验证码不显示解决方法详解
  2. 开学优惠高颜值蓝牙耳机排行榜,2021最佳游戏伴侣,低延迟蓝牙耳机推荐
  3. springboot tomcat 调优
  4. 探究核壳结构聚苯乙烯油酸上转换纳米颗粒的制备方法
  5. 手机型号大全_中兴“长辈智能手机”发布:支持远程协助 999元起
  6. Unity3D之风,区域风,光斑
  7. 【大数据技术】爆肝3天 7个章节 Hive 3.1.3详解
  8. Itext设置导出word文件的字体
  9. Oracle:时间类型
  10. RTMP直播 浏览器通过jwplayer播放