Error[8]: Undefined offset: 12, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图在一个看起来像这样的文件上找到正确的命令来执行:(即.cshrc文件) setenv BLAH foo 我需要命令来替换检测到字符串BLAH的行并替换整行,如下所示: setenv BLAH newfoo 如果文件中不存在BLAH,则将其附加到文件中. 我已经玩过这样的sed,但这并没有实现我的目标. sed 's/^.*?BLAH.*/setenv BLAH newfoo/g' text. 我试图在一个看起来像这样的文件上找到正确的命令来执行:(即.cshrc文件)

setenv BLAH foo

我需要命令来替换检测到字符串BLAH的行并替换整行,如下所示:

setenv BLAH newfoo

如果文件中不存在BLAH,则将其附加到文件中.

我已经玩过这样的sed,但这并没有实现我的目标.

sed 's/^.*?BLAH.*/setenv BLAH newfoo/g' text.txt > text.tmp && mv text.tmp text.txt

我也玩过awk并且似乎无法使命令正常工作我想要它.

awk -v s="setenv BLAH newfoo" '/^BLAH/{f=1;
ARG1=""sed -i "/BLAH/s/^.*$/setenv ${ENV_KEY} ${ENV_VAL}/g" file.txt# If the BLAH keyword isnt there,append the file then.grep -v -q "BLAH" file.txt && echo "setenv BLAH ${ARG1}" >> file.txt
=s}7;END{if(!f)print s}' text.txt > text.tmp && mv text.tmp text.txt

关于如何实现这一点的任何想法都会很棒.

UPDATE

我试图让这个脚本按预期工作.

脚本

sed  '/BLAH/{s/ \w+$/ newfoo/;h};${x;/BLAH/ba;x;s/$/\nsetenv BLAH newfoo/;x;:a;x}'

file.txt(默认)

setenv BLAH randomstring

脚本的用法

script.sh newvalue

file.txt(结果)

setenv BLAH newvalue

目前,脚本似乎每次都附加文件.我还尝试了一些其他的建议,但我不能让他们接受sed字符串中的传入arg1值.

解决方法 介绍

这可以通过这个sed脚本完成:

sed -e '    /^\(\|.*\W\)BLAH\(\W.*\|\)$/{  # lines matching word BLAH      s/ \w\+$/ newfoo/; # replace last word by "newfoo"      h;         # Store for not adding them at end of file     };    ${           # On last line...      x;         # Swap stored line with current line      /BLAH/ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back}'

说明

sed -e'/BLAH/{h};${x;/BLAH/ba;x;s/$/\nsetenv BLAH newfoo/;x;:a;x}' -i text.txt

您可以使用就地编辑开关:

sed -e '    /^\(.*\W\|\)BLAH\(\W.*\|\)$/{h}; # Store lines matching word BLAH    ${           # On last line...      x;         # Swap stored line with current line      /./ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back    }'  <(echo BLAH=foo;seq 1 4)BLAH=foo1234

为了更准确,搜索分隔的单词BLAH:

sed -e '    /^\(.*\W\|\)BLAH\(\W.*\|\)$/{h}; # Store lines matching word BLAH    ${           # On last line...      x;         # Swap stored line with current line      /./ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back    }'  <(echo BLAHBLAH=foo;seq 1 4)BLAHBLAH=foo1234setenv BLAH newfoo

sedcmd='/^\(.*\W\|\)%s\(\W.*\|\)$/{s/ \w\+$/ %s/;h};'sedcmd+='${x;/./ba;x;s/$/\nsetenv %s %s/;x;:a;x}'varnam=BLAHvarcnt=foofilnam=/tmp/file.txtprintf -v sedcmd "$sedcmd" ${varnam} ${varcnt} ${varnam} ${varcnt}sed -e "$sedcmd" -i "$filnam"

您可能会看到第二个BLAH被替换为..这可以完成,因为如果未找到1st,则交换空间为空.因此,如果至少有一个字符,这意味着第一个确实发生了.

清洁和脚本

有一种方法可以使它更具脚本化:

sed -e "$sedcmd" <(echo setenv BLAH oldfoo;seq 1 4) setenv BLAH foo1234sed -e "$sedcmd" <(echo setenv BLAHBLAH oldfoo;seq 1 4) setenv BLAHBLAH oldfoo1234setenv BLAH foo

你可以删除最后一行的-i开关……

您可以通过运行来尝试:

[+++] 总结

以上是内存溢出为你收集整理的使用Regex替换或追加文件中的行| Linux Shell脚本全部内容,希望文章能够帮你解决使用Regex替换或追加文件中的行| Linux Shell脚本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
使用Regex替换或追加文件中的行| Linux Shell脚本_系统运维_内存溢出

使用Regex替换或追加文件中的行| Linux Shell脚本

使用Regex替换或追加文件中的行| Linux Shell脚本,第1张

概述我试图在一个看起来像这样的文件上找到正确的命令来执行:(即.cshrc文件) setenv BLAH foo 我需要命令来替换检测到字符串BLAH的行并替换整行,如下所示: setenv BLAH newfoo 如果文件中不存在BLAH,则将其附加到文件中. 我已经玩过这样的sed,但这并没有实现我的目标. sed 's/^.*?BLAH.*/setenv BLAH newfoo/g' text. 我试图在一个看起来像这样的文件上找到正确的命令来执行:(即.cshrc文件)

setenv BLAH foo

我需要命令来替换检测到字符串BLAH的行并替换整行,如下所示:

setenv BLAH newfoo

如果文件中不存在BLAH,则将其附加到文件中.

我已经玩过这样的sed,但这并没有实现我的目标.

sed 's/^.*?BLAH.*/setenv BLAH newfoo/g' text.txt > text.tmp && mv text.tmp text.txt

我也玩过awk并且似乎无法使命令正常工作我想要它.

awk -v s="setenv BLAH newfoo" '/^BLAH/{f=1;
ARG1=""sed -i "/BLAH/s/^.*$/setenv ${ENV_KEY} ${ENV_VAL}/g" file.txt# If the BLAH keyword isnt there,append the file then.grep -v -q "BLAH" file.txt && echo "setenv BLAH ${ARG1}" >> file.txt
=s}7;END{if(!f)print s}' text.txt > text.tmp && mv text.tmp text.txt

关于如何实现这一点的任何想法都会很棒.

UPDATE

我试图让这个脚本按预期工作.

脚本

sed  '/BLAH/{s/ \w+$/ newfoo/;h};${x;/BLAH/ba;x;s/$/\nsetenv BLAH newfoo/;x;:a;x}'

file.txt(默认)

setenv BLAH randomstring

脚本的用法

script.sh newvalue

file.txt(结果)

setenv BLAH newvalue

目前,脚本似乎每次都附加文件.我还尝试了一些其他的建议,但我不能让他们接受sed字符串中的传入arg1值.

解决方法 介绍

这可以通过这个sed脚本完成:

sed -e '    /^\(\|.*\W\)BLAH\(\W.*\|\)$/{  # lines matching word BLAH      s/ \w\+$/ newfoo/; # replace last word by "newfoo"      h;         # Store for not adding them at end of file     };    ${           # On last line...      x;         # Swap stored line with current line      /BLAH/ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back}'

说明

sed -e'/BLAH/{h};${x;/BLAH/ba;x;s/$/\nsetenv BLAH newfoo/;x;:a;x}' -i text.txt

您可以使用就地编辑开关:

sed -e '    /^\(.*\W\|\)BLAH\(\W.*\|\)$/{h}; # Store lines matching word BLAH    ${           # On last line...      x;         # Swap stored line with current line      /./ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back    }'  <(echo BLAH=foo;seq 1 4)BLAH=foo1234

为了更准确,搜索分隔的单词BLAH:

sed -e '    /^\(.*\W\|\)BLAH\(\W.*\|\)$/{h}; # Store lines matching word BLAH    ${           # On last line...      x;         # Swap stored line with current line      /./ba;  # if match,branch to label a:      x;         # Swap back      s/$/\nsetenv BLAH newfoo/; # Replace end of line with newline...      x;         # Swap again    :a;          # Label a:      x          # Swap back    }'  <(echo BLAHBLAH=foo;seq 1 4)BLAHBLAH=foo1234setenv BLAH newfoo

sedcmd='/^\(.*\W\|\)%s\(\W.*\|\)$/{s/ \w\+$/ %s/;h};'sedcmd+='${x;/./ba;x;s/$/\nsetenv %s %s/;x;:a;x}'varnam=BLAHvarcnt=foofilnam=/tmp/file.txtprintf -v sedcmd "$sedcmd" ${varnam} ${varcnt} ${varnam} ${varcnt}sed -e "$sedcmd" -i "$filnam"

您可能会看到第二个BLAH被替换为..这可以完成,因为如果未找到1st,则交换空间为空.因此,如果至少有一个字符,这意味着第一个确实发生了.

清洁和脚本

有一种方法可以使它更具脚本化:

sed -e "$sedcmd" <(echo setenv BLAH oldfoo;seq 1 4) setenv BLAH foo1234sed -e "$sedcmd" <(echo setenv BLAHBLAH oldfoo;seq 1 4) setenv BLAHBLAH oldfoo1234setenv BLAH foo

你可以删除最后一行的-i开关……

您可以通过运行来尝试:

总结

以上是内存溢出为你收集整理的使用Regex替换或追加文件中的行| Linux Shell脚本全部内容,希望文章能够帮你解决使用Regex替换或追加文件中的行| Linux Shell脚本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1027377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存