0

我有一个文本文件,其中包含结构为 ABC123456A 或 ABC123456AA 的文件列表。我想做的是检查文件 ABC123456ZZP 是否也存在。即我想用 ZZP 替换 ABC123456 之后的字母

我可以使用 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 个字符(不包括空格),然后检查是否存在以 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 解决方案更高效、更健壮,并且在这两种情况下都与其他 shell 解决方案相似。

于 2013-01-14T14:24:23.847 回答