我有一个文本文件,其中包含结构为ABC123456A或ABC123456AA的文件列表。我想做的是检查文件ABC123456ZZP是否也存在。即我想在ABC123456之后用ZZP替换字母
我可以使用sed吗?
答案 0 :(得分:2)
喜欢这个吗?
X=ABC123456 ; echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP,"
答案 1 :(得分:1)
你可以使用sed作为wilx建议,但我认为更好的选择是bash。
while read file; do
base=${file:0:9}
[[ -f ${base}ZZP ]] && echo "${base}ZZP exists!"
done < file
这将遍历文件中的每一行 然后base设置为该行的前9个字符(不包括空格) 然后检查基础末尾是否存在ZZP文件,如果存在,则打印一条消息。
答案 2 :(得分: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解决方案类似。