首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用BASH替换包含正斜杠的两个模式之间的所有文本?

如何使用BASH替换包含正斜杠的两个模式之间的所有文本?
EN

Stack Overflow用户
提问于 2022-10-11 13:34:30
回答 2查看 57关注 0票数 -1

我正在尝试编写一个脚本,在"opt/“和"/”两种模式之间替换文本文件中的文本。文件中数据的一个示例是:

代码语言:javascript
复制
daw9udiwa9diuoawdj098awd89a0909w  opt/TEXTTOREPLACE/app-data/version.txt
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/TEXTTOREPLACE/app-data/package.txt
awdhaw9d8yawdf8uaw9f8uwafhiuhawf  opt/TEXTTOREPLACE/bin/somefile/somefile
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/TEXTTOREPLACE/bin/someapp/somefile

我已经看过如何使用'sed‘命令,但是模式匹配使我感到困惑。

我试过:

代码语言:javascript
复制
sed -e 's!\/[^\/]*\/!\/CHANGE TO ME\/!' 

这是可行的,但我想在开头添加"opt“,以尽量减少错误。

所以我在没有运气的情况下尝试了以下方法

代码语言:javascript
复制
sed -e 's!opt\/[^opt\/]*\/!opt\/CHANGE TO ME\/!'

我将使用$VAR替换文本,例如

代码语言:javascript
复制
VAR=CHANGED
sed -e 's!opt\/[^opt\/]*\/!opt\/$VAR\/!'


output:
daw9udiwa9diuoawdj098awd89a0909w  opt/CHANGED/app-data/version.txt
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/app-data/package.txt
awdhaw9d8yawdf8uaw9f8uwafhiuhawf  opt/CHANGED/bin/somefile/somefile
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/bin/someapp/somefile

帮助感激。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-11 14:02:34

当前sed代码中的几个问题:

要扩展OS变量,必须用双引号( history)

  • escaping

  • )包装sed脚本使用!作为分隔符可能会导致某些shell和/或shell配置(例如,!是访问命令行sed的常用缩写,只有在/还充当sed脚本分隔符(即,如果使用不同的分隔符)H 214F 215脚本分隔符时才需要/

解决这些问题的一个sed想法是:

代码语言:javascript
复制
sed -e "s|opt/[^/]*|opt/$VAR|" input.txt

其中:

  • opt/[^/]* -匹配字符串opt/加上所有不是\
  • opt/$VAR的字符-替换为字符串opt/加上OS VAR变量

的内容。

这就产生了:

代码语言:javascript
复制
daw9udiwa9diuoawdj098awd89a0909w  opt/CHANGED/app-data/version.txt
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/app-data/package.txt
awdhaw9d8yawdf8uaw9f8uwafhiuhawf  opt/CHANGED/bin/somefile/somefile
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/bin/someapp/somefile
票数 2
EN

Stack Overflow用户

发布于 2022-10-11 14:02:05

如果您愿意使用awk而不是sed,那么以下内容可能适用于您:

代码语言:javascript
复制
$ awk -v rep="CHANGED" -F/ 'BEGIN{OFS="/"} {$2=rep; print}' file1 
daw9udiwa9diuoawdj098awd89a0909w  opt/CHANGED/app-data/version.txt
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/app-data/package.txt
awdhaw9d8yawdf8uaw9f8uwafhiuhawf  opt/CHANGED/bin/somefile/somefile
wdalkwhjf8aufwaoif98fawfojaw98f8  opt/CHANGED/bin/someapp/somefile

分割正斜杠字符上的每一行,并用所需的替换文本替换第二个字段。然后将输出设置为输出字段分隔符(OFS),设置为正斜杠。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74029013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档