我有一个包含大量下划线的文件,我必须用空字符串替换它们,除了属于特定字符串usr_mstr的那些字符串.我已经尝试过sed命令,它取代了下划线并排除了我提供的单词,但它也会在紧跟下划线后立即替换该字符!任何帮助将不胜感激..
echo "fname_sname_id_usr_mstr" | sed 's/_[^usr_mstr]//g'
Run Code Online (Sandbox Code Playgroud)
预期产量:
fnamesnameidusr_mstr
Run Code Online (Sandbox Code Playgroud)
实际产量:
fnamenamedusr_mstr
Run Code Online (Sandbox Code Playgroud)
(s并被i取代)
这可能适合你(GNU sed):
sed -r 's/(usr_mstr)|_/\1/g' file
Run Code Online (Sandbox Code Playgroud)
在全球范围内更换usr_mstr由itsself或更换_由什么
[^usr_mstr]是,这不是任何字符匹配的字符类u,s,r,m,t,或_.
Perl支持"环顾"断言,因此您可以编写:
echo "fname_sname_id_usr_mstr_x_usr_other_mstr_y_usrmstr_z" \
| perl -pe 's/(?<!usr)_//g;s/_(?!mstr)//g'
Run Code Online (Sandbox Code Playgroud)
即如果没有前面的usr,则替换_ ,而不是后面的mstr.