繁体   English   中英

使用sed替换未知字符串的一部分

[英]Using sed to replace a part of a string that is unknown

我有一个文本文件:

example.txt

UserName = JIU62H123;
USER_NAME = JIU62H123;

我需要将JIU62H123更改为A5B4C6DF9 显然,对于此文件,我可以这样做:

//bash
sed -i '' 's/JIU62H123/A5B4C6DF9/g' example.txt

从结果中可以看出,这适用于此文件:

example.txt

UserName = A5B4C6DF9;
USER_NAME = A5B4C6DF9;

但是,实际上,我不知道用户名是否真的提前。 我所知道的是文件的形状如下:

example.txt

UserName = <some_letters_and_numbers>;
USER_NAME = <some_letters_and_numbers>;

我基本上需要将<some_letters_and_numbers>更改为A5B4C6DF9 可以使用一个或多个sed命令完成此操作吗?

如何使用正则表达式?

sed -ir 's/^(USER_NAME|UserName) = [A-Za-z0-9]+;$/\1 = A5B4C6DF9;/g' example.txt

用真实的话说:

  • 在以UserNameUSER_NAME开头,后跟等号=
  • 用...代替右手边

sed语法:

使用变量来适应

newId=A5B4C6DF9
sed -e '/^U\(serName\|\SER_NAME) *=/s/= .*$/'$newId/ -i example.txt

注意引用部分在变量之前!

直到$newId都不包含特殊字符。 如果变量可以包含空格或其他非字母数字字符,请使用双引号:

sed -e '/^U\(serName\|\SER_NAME) *=/s/= .*$/'"$newId"/ -i example.txt

使用awk,您可以:

$ awk '{$3="A5B4C6DF9;"}1' file
UserName = A5B4C6DF9;
USER_NAME = A5B4C6DF9;

即。 替换第三个空格分隔的字段。 使用最新的GNU awk,您可以进行就地编辑:

$ awk -i inplace '{$3="A5B4C6DF9;"}1' file

要将change <some_letters_and_numbers> to A5B4C6DF9并假设您打算on the right side of "= "带有on the right side of "= " -E on the right side of "= "的sed的sed on the right side of "= "添加on the right side of "= " ,这是针对ERE的:

$ sed -E 's/= [[:alnum:]]+/= A5B4C6DF9/' file
UserName = A5B4C6DF9;
USER_NAME = A5B4C6DF9;

以及任何POSIX sed:

$ sed 's/= [[:alnum:]][[:alnum:]]*/= A5B4C6DF9/' file
UserName = A5B4C6DF9;
USER_NAME = A5B4C6DF9;

非常感谢您的回答,每个人都赞成。 我最终做了这样的解决方案:

sed -i '' -E 's/(DEVELOPMENT_TEAM|DevelopmentTeam)( = )(.*)/\1\2A5B4C6DF9;/' example.txt

此处给出的大多数答案似乎都与字母/数字模式匹配,但我认为最好将其与任何内容匹配并用所需的内容替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM