ABC123456A または ABC123456AA という構造のファイルのリストを含むテキスト ファイルがあります。私がやりたいことは、ファイル ABC123456ZZP も存在するかどうかを確認することです。つまり、ABC123456 の後の文字を ZZP に置き換えたい
sedを使用してこれを行うことはできますか?
このような?
X=ABC123456 ; echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP,"
wilxが示唆するようにsedを使用できますが、より良いオプションはbashだと思います。
while read file; do
base=${file:0:9}
[[ -f ${base}ZZP ]] && echo "${base}ZZP exists!"
done < file
これはファイル内の各行をループし、base が行の最初の 9 文字 (空白を除く) に設定され、base の末尾に ZZP があるファイルが存在するかどうかを確認し、存在する場合はメッセージを出力します。
見て:
$ str="ABC123456AA"
$ echo "${str%[[:alpha:]][[:alpha:]]*}"
ABC123456
これを行います:
while IFS= read -r tgt; do
tgt="${tgt%[[:alpha:]][[:alpha:]]*}ZZP"
[[ -f "$tgt" ]] && printf "%s exists!\n" "$tgt"
done < file
改行を含むファイル名ではまだ失敗するため、そのような状況がある場合はお知らせください。ただし、他の投稿されたソリューションとは異なり、9 文字以外のキー文字を含むファイル名、スペース、コンマ、バックスラッシュ、グロブ文字を含むファイル名、などなど、効率的です。
各行の最初の 9 文字だけが必要であり、すべての行を sed にパイプすることに満足していると言ったので、別の解決策を次に示します。
cut -c1-9 file |
while IFS= read -r tgt; do
[[ -f "${tgt}ZZP" ]] && printf "%sZZP exists!\n" "$tgt"
done
sed ソリューションよりもはるかに効率的で堅牢であり、両方のコンテキストで他のシェル ソリューションと同様です。