sed用2个字符串之间的下划线替换空格

gar*_*y69 3 regex perl awk sed

我有一个包含这样的行的文件

some thing <phrase>a phrase</phrase> some thing else <phrase>other stuff</phrase>

我需要<phrase>用下划线替换标签之间的所有空格.所以基本上我需要更换介于两者之间></下划线的每个空间.我在sed,awk和perl中尝试了很多不同的命令,但是还没有能够得到任何工作.以下是我尝试过的一些命令.

sed 's@>\s+[</]@_@g'

perl -pe 'sub c{$s=shift;$s=~s/ /_/g;$s}s/>.*?[<\/]/c$&/ge'

sed 's@\(\[>^[<\/]]*\)\s+@\1_@g'

awk -v RS='\\[>^[<\]/]*\\]' '{ gsub(/\<(\s+)\>/, "_", RT); printf "%s%s", $0, RT }' infile

我一直在看这两个问题试图修改答案以使用我需要的字符.
sed仅在特定字符模式之间替换短划线

https://unix.stackexchange.com/questions/63335/how-to-remove-all-white-spaces-just-between-brackets-using-unix-tools

有人可以帮忙吗?

hau*_*kex 5

不要使用正则表达式来解析XML/HTML.

use warnings;
use 5.014;  # for /r modifier
use Mojo::DOM;

my $text = <<'ENDTEXT';
some thing <phrase>a phrase</phrase> some thing else <phrase>other stuff</phrase>
ENDTEXT

my $dom = Mojo::DOM->new($text);
$dom->find('phrase')->each(sub { $_->content( $_->content=~tr/ /_/r ) });
print $dom;
Run Code Online (Sandbox Code Playgroud)

输出:

some thing <phrase>a_phrase</phrase> some thing else <phrase>other_stuff</phrase>
Run Code Online (Sandbox Code Playgroud)

更新: Mojolicious甚至包含一些糖,允许将该代码粉碎成oneliner:

$ perl -Mojo -pe '($_=x($_))->find("phrase")->each(sub{$_->content($_->content=~tr/ /_/r)})' input.txt
Run Code Online (Sandbox Code Playgroud)

  • @ gary69"自由文本"只是XML中的一个文本节点.除了作为单独节点的XML标记外,它可以包含任何内容.与大多数HTML/XML解析器一样,Mojo :: DOM也允许您访问文本节点. (2认同)