@Tshepang имеет верное представление. Я не знаю, который является самым портативным, но здесь является другими способами обнаружить, является ли пользователь корнем:
id -u
$UID
С другой стороны, можно просто вынудить это работать как другой пользователь с теми же параметрами:
if [[ "$USER" != appuser ]]
then
exec sudo -u appuser "$0" "$@"
fi
Вот awk решение. Я не знаю YML, таким образом, Вы, возможно, должны играть с regexps (например, маркер региона может быть расположен с отступом?). Обратите внимание что print data >filename
конструкция создает или усекает файл в первый раз, когда это достигнуто данное имя файла и затем добавляет в файл.
<input.yml awk '
/^[^ :]+: *$/ {sub(/: *$/,""); region=$0} # start of region
/^ *groups:/ { # owner or member list
sub(/^[^:]*: *\[/, ""); sub(/\].*/, ""); # extract bracketed names
split($0, names, / *, */); # split comma-separated list
for (n in names) # iterate over names
print region >names[n] ".txt"; # write or append to name file
}'
Не относитесь к нему слишком серьезно, но вот решение для sed и оболочки.
<input.yml sed -n -e '/^[^ ]/ h' \
-e '/^ \+groups:/ {' \
-e 'G' \
-e 's/^[^:]*: *\[\(.*\)\]\n\(.*\):/\2,\1/' \
-e 's/, \+/,/g' \
-e 'p' -e '}' | (
IFS=,; set -f
while read -r region names; do
for name in $names; do
echo "$region" >>"$name.txt"
done
done
)
'perl' решение:
Сценарий:
use warnings;
use strict;
die "Usage: perl $0 file\n" unless @ARGV == 1;
my (%hash, $region);
open my $fh, "<", $ARGV[0] or die "Cannot open file $ARGV[0]: $!\n";
while ( my $line = <$fh> ) {
## Get region, characters until first ':' without spaces at the beginning.
$region = $1 if $line =~ /^([^:\s]+)/;
## Get names with a regex and save them as keys of a hash, values will be
## regions.
if ( $line =~ /^\s*(?i:groups):\s*\[([^\]]*)\]\s*$/ ) {
my @names = split /,\s*/, $1;
for my $name ( @names ) {
push @{ $hash{ $name } }, $region;
}
}
}
## Read names (keys of the hash), open a file for each one and write regions on it.
for my $name ( sort keys %hash ) {
my $outfile = $name . ".txt";
open my $ofh, ">", $outfile or do { warn "Cannot open $outfile: $!\n"; next };
print $ofh join( ", ", @{ $hash{ $name } } ), "\n";
close $ofh or warn "Cannot close $outfile\n";
}
close $fh or warn "Cannot close $ARGV[0]\n";
Выполнение:
$ perl script.pl infile
[^ :]+:
заставить его работать. YML, все о правильном количестве подкаталогов :) – yellowblood 09.05.2011, 00:07