我正在尝试编写一个脚本,在"opt/“和"/”两种模式之间替换文本文件中的文本。文件中数据的一个示例是:
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‘命令,但是模式匹配使我感到困惑。
我试过:
sed -e 's!\/[^\/]*\/!\/CHANGE TO ME\/!' 这是可行的,但我想在开头添加"opt“,以尽量减少错误。
所以我在没有运气的情况下尝试了以下方法
sed -e 's!opt\/[^opt\/]*\/!opt\/CHANGE TO ME\/!'我将使用$VAR替换文本,例如
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帮助感激。谢谢
发布于 2022-10-11 14:02:34
当前sed代码中的几个问题:
要扩展OS变量,必须用双引号( history)
sed脚本使用!作为分隔符可能会导致某些shell和/或shell配置(例如,!是访问命令行sed的常用缩写,只有在/还充当sed脚本分隔符(即,如果使用不同的分隔符)H 214F 215脚本分隔符时才需要/。解决这些问题的一个sed想法是:
sed -e "s|opt/[^/]*|opt/$VAR|" input.txt其中:
opt/[^/]* -匹配字符串opt/加上所有不是\opt/$VAR的字符-替换为字符串opt/加上OS VAR变量的内容。
这就产生了:
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发布于 2022-10-11 14:02:05
如果您愿意使用awk而不是sed,那么以下内容可能适用于您:
$ 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),设置为正斜杠。
https://stackoverflow.com/questions/74029013
复制相似问题