gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:00:26 25 4
gpt4 key购买 nike

我正在尝试找到在看起来像这样的文件上执行的正确命令:(即 .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;$0=s}7;END{if(!f)print s}' text.txt > text.tmp && mv text.tmp text.txt

关于如何实现这一目标的任何想法都很棒。

更新

我正在努力让这个脚本按预期工作。

脚本

ARG1="$1"
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

file.txt(默认)

setenv BLAH 随机字符串

脚本的使用

script.sh 新值

file.txt(结果)

setenv BLAH 新值

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

最佳答案

介绍

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

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

说明

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
}'

您可以使用 in place edition 开关:

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

为了更准确,搜索分隔词 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 BLAH=foo;seq 1 4)
BLAH=foo
1
2
3
4

同时

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=foo
1
2
3
4
setenv BLAH newfoo

您可能会看到第二个 BLAH 被替换为 .。这是可以做到的,因为如果找不到第一个,交换空间就是空的。所以如果至少有一个字符,这意味着第一个确实发生了。

清洁和脚本

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

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

您可以删除最后一行的 -i 开关...

您可以通过运行来尝试:

sed -e "$sedcmd" <(echo setenv BLAH oldfoo;seq 1 4) 
setenv BLAH foo
1
2
3
4

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

关于regex - 使用 Regex 替换或追加文件中的行 | Linux shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com