简单的sed替代

时间:2013-01-14 11:46:01

标签: linux sed awk csh

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

我可以使用sed吗?

3 个答案:

答案 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解决方案类似。