
1行に1単語ずつ100を超える単語のリストを含むテキストファイルがあります。
Oliver.txt
Jack.txt
Noah.txt
Leo.txt
William.txt
テキストファイルの内容を次に変換したいと思います。
gallery-dl -g -i Oliver.txt > OliverX.txt
gallery-dl -g -i Jack.txt > JackX.txt
すべての単語についても同様です。どうすればいいですか?
答え1
GNU awkから:
awk -i inplace -v FS="." '{print "gallery-dl -g -i " $1 ".txt > " $1 "X.txt"}' FILE
それが何を置き換えるのか文書新しいコンテンツとして。-i inplace
新しいコンテンツをstdoutとして印刷し、元のコンテンツが必要な場合は削除します。文書触れていない。
答え2
perl
または でほぼ同じ構文を使用して、この操作を簡単に実行できますsed
。
sed
:
$ sed -E 's/(.*).txt/gallery-dl -g -i \1.txt > \1X.txt/' file
gallery-dl -g -i Oliver.txt > OliverX.txt
gallery-dl -g -i Jack.txt > JackX.txt
gallery-dl -g -i Noah.txt > NoahX.txt
gallery-dl -g -i Leo.txt > LeoX.txt
gallery-dl -g -i William.txt > WilliamX.txt
perl
:
$ perl -pe 's/(.*).txt/gallery-dl -g -i \1.txt > \1X.txt/' file
gallery-dl -g -i Oliver.txt > OliverX.txt
gallery-dl -g -i Jack.txt > JackX.txt
gallery-dl -g -i Noah.txt > NoahX.txt
gallery-dl -g -i Leo.txt > LeoX.txt
gallery-dl -g -i William.txt > WilliamX.txt
答え3
使用幸せ(以前のPerl_6)
raku -pe 's/ ^ (.+) \.txt $ /gallery-dl -g -i $0.txt > $0X.txt/;'
@terdonのPerl(5)コードと同様に、Rakuのキャプチャは$0
Perl(5)ではなく1から始まります。上記のコードでは、(.+)
拡張子の前に少なくとも1つの文字が必要です\.txt
。alnum
Raku代替演算子の左半分のすべての非文字は、s///
リテラルとして理解されるようにエスケープする必要があります(例\.txt
:)。最後に、Raku代替演算子の左半分はデフォルトでs///
空白を受け入れます。
入力例:
Oliver.txt
Jack.txt
Noah.txt
Leo.txt
William.txt
出力例:
gallery-dl -g -i Oliver.txt > OliverX.txt
gallery-dl -g -i Jack.txt > JackX.txt
gallery-dl -g -i Noah.txt > NoahX.txt
gallery-dl -g -i Leo.txt > LeoX.txt
gallery-dl -g -i William.txt > WilliamX.txt