除了Unix Shell中特定单词或模式的一部分之外,如何替换文本中的所有下划线

Des*_* me 2 unix shell sed

我有一个包含大量下划线的文件,我必须用空字符串替换它们,除了属于特定字符串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取代)

pot*_*ong 6

这可能适合你(GNU sed):

sed -r 's/(usr_mstr)|_/\1/g' file
Run Code Online (Sandbox Code Playgroud)

在全球范围内更换usr_mstr由itsself或更换_由什么

  • 聪明.请注意,在某些系统上,它是`-E`而不是`-r`. (2认同)

cho*_*oba 5

[^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.