파일이 있습니다:
- id: 1.4.25.2
name: 'Configuring a VNC Server'
permalink: '/rhcsa/managing-network-services/configuring-vnc-access/configuring-a-vnc-server'
description: '<*description>'
content: []
- id: 1.4.25.3
name: 'Connecting to a VNC Server'
permalink: '/rhcsa/managing-network-services/configuring-vnc-access/connecting-to-a-vnc-server'
description: '<*description>'
content: []
<*description>
각 콘텐츠를 일부 텍스트로 바꿔야 합니다 . 당연히 정규식을 사용하려고 생각했습니다. 분명히 (이 사이트의 일부 답변에 따르면) sed
교체에 대한 탐욕스럽지 않은 수정자는 없습니다. 그래서 Perl을 사용해 보았습니다.
(.*id: 1\.4\.25\.2(?:\n|.)*)\'(\<\*description\>)\'
필요한 부분을 선택하지 않으면 해당 부분은 yaml 배열의 다음 요소(라인 앞) - id: 1.4.25.2
까지 나옵니다 . 이 작업을 수행하는 방법과 다른 곳에서 가져온 사용자 정의 텍스트를 사용하여 파일의 각 항목에 대한 설명을 변경하는 방법을 알 수 없습니다!description: '<*description>'\ncontent: []
- id: 1.4.25.3
답변1
YAML 모듈을 사용하면 데이터 구조를 재귀적으로 탐색하고 일치하는 요소를 표준 입력에서 읽은 줄로 바꿉니다.
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use YAML::Tiny;
my $yaml =
YAML::Tiny->read( $ARGV[0] // die "Usage: $0 yaml-file [out-file]\n" );
mangle_description( $yaml->[0] );
$yaml->write( $ARGV[1] // "$ARGV[0].out" );
sub mangle_description {
my $what = shift;
my $type = ref $what;
if ( $type eq 'HASH' ) {
for my $key ( keys %$what ) {
if ( $key eq 'description'
and $what->{$key} eq '<*description>' ) {
$what->{$key} = set_description();
}
mangle_description( $what->{$key} ) if ref $what->{$key};
}
} elsif ( $type eq 'ARRAY' ) {
for my $entry (@$what) {
mangle_description($entry);
}
} else {
warn Dumper $what;
die "unknown type in YAML ??\n";
}
}
sub set_description {
my $next = readline *STDIN;
chomp $next;
return $next;
}
parser
위의 내용은 다음 위치에 유효한 YAML 로 저장됩니다 input
.
$ yes | perl parser input
$ grep description input.out
description: y
description: y
$