0

ABC123456A または ABC123456AA という構造のファイルのリストを含むテキスト ファイルがあります。私がやりたいことは、ファイル ABC123456ZZP も存在するかどうかを確認することです。つまり、ABC123456 の後の文字を ZZP に置き換えたい

sedを使用してこれを行うことはできますか?

4

3 に答える 3

2

このような?

X=ABC123456 ;  echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP,"
于 2013-01-14T11:55:19.903 に答える
1

wilxが示唆するようにsedを使用できますが、より良いオプションはbashだと思います。

while read file; do
    base=${file:0:9}
    [[ -f ${base}ZZP ]] && echo "${base}ZZP exists!"
done < file

これはファイル内の各行をループし、base が行の最初の 9 文字 (空白を除く) に設定され、base の末尾に ZZP があるファイルが存在するかどうかを確認し、存在する場合はメッセージを出力します。

于 2013-01-14T12:05:36.330 に答える
0

見て:

$ 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 ソリューションよりもはるかに効率的で堅牢であり、両方のコンテキストで他のシェル ソリューションと同様です。

于 2013-01-14T14:24:23.847 に答える